Не усложняйте QThread, используйте библиотеку потоков:
def main():
app = QtWidgets.QApplication(sys.argv)
window = mainApp()
threading.Thread(target=window.checkInternetConnection, daemon=True).start()
window.show()
app.exec()
С другой стороны, поскольку вы используете поток, вы не должны обновлять графический интерфейс из другого потока, для этого вы можете используйте QMetaObject::invokeMethod
:
def checkInternetConnection(self,host="8.8.8.8", port=53, timeout=3):
while True:
try:
socket.setdefaulttimeout(timeout)
socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect((host, port))
self.conection = True
except Exception as e:
self.conection = False
print(e)
msg = "" if self.conection else 'Please Check Internect Connection'
print("msg", msg)
QtCore.QMetaObject.invokeMethod(self.label_9, "setText",
QtCore.Qt.QueuedConnection,
QtCore.Q_ARG(str, msg))
self.finished.emit()
Это верно, что часть пути не может содержать период или много других специальных символов в этом отношении. Я испытал ту же проблему некоторое время назад и получил ответ от команды TechNet, заявляющей, что querystring является Вашей единственной опцией, которую находит можение.Прошу прощения
http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/d03c8331-1e98-4d5d-82a7-390942a93012/
У меня есть сервис почти с точной подписью. Я могу передать значения, которые имеют a"." на имя. Например, это работало бы над моим:
[OperationContract]
[WebGet(UriTemplate = "category/{id}")]
string category(string id);
с URL http://localhost/MyService.svc/category/test.category
Я добираюсь, значение '"test.category" передало в как строковое значение.
Таким образом, должна быть некоторая другая проблема. как Вы получаете доступ к URL? просто непосредственно в браузере? Или через вызов JavaScript? Просто удивление, если это - некоторая ошибка на стороне клиента. Сервер передает значение очень хорошо. Я был бы, рекомендуя пытающийся получить доступ к URL в Вашем браузере, и если он не работает затем сообщение точно, какой URL Вы используете и каково сообщение об ошибке было.
Кроме того, Вы используете WCF 3.5 SP1 или просто WCF 3.5? В УСПОКОИТЕЛЬНОЙ книге .NET я читаю, я вижу, что были некоторые изменения относительно UriTemplate.
И наконец, я изменил простой Сервис из УСПОКОИТЕЛЬНОЙ книги .NET, которая работает, и я получаю корректный ответ.
class Program
{
static void Main(string[] args)
{
var binding = new WebHttpBinding();
var sh = new WebServiceHost(typeof(TestService));
sh.AddServiceEndpoint(typeof(TestService),
binding,
"http://localhost:8889/TestHttp");
sh.Open();
Console.WriteLine("Simple HTTP Service Listening");
Console.WriteLine("Press enter to stop service");
Console.ReadLine();
}
}
[ServiceContract]
public class TestService
{
[OperationContract]
[WebGet(UriTemplate = "category/{id}")]
public string category(string id)
{
return "got '" + id + "'";
}
}
Вот пример HttpModule, который фиксирует «период», когда они встречаются в параметрах REST. Обратите внимание, что я видел это только на сервере разработки (он же Cassini), в IIS7, кажется, работает без этого "взлома". Пример, который я привел ниже, также заменяет расширение файла .svc, которое я адаптировал из этого ответа. Как удалить расширение «.svc» в службе RESTful WCF?
public class RestModule : IHttpModule
{
public void Dispose()
{
}
public void Init(HttpApplication context)
{
context.BeginRequest +=
delegate
{
HttpContext ctx = HttpContext.Current;
string path = ctx.Request.AppRelativeCurrentExecutionFilePath;
int i = path.IndexOf('/', 2);
if (i > 0)
{
int j = path.IndexOf(".svc", 2);
if (j < 0)
{
RewritePath(ctx, path, i, ".svc");
}
else
{
RewritePath(ctx, path, j + 4, "");
}
}
};
}
private void RewritePath(HttpContext ctx, string path, int index, string suffix)
{
string svc = path.Substring(0, index) + suffix;
string rest = path.Substring(index);
if (!rest.EndsWith(ctx.Request.PathInfo))
{
rest += ctx.Request.PathInfo;
}
string qs = ctx.Request.QueryString.ToString();
ctx.RewritePath(svc, rest, qs, false);
}
}