WCF параметры REST не может содержать периоды?

Не усложняйте 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()
5
задан John Ketchpaw 4 February 2009 в 20:39
поделиться

3 ответа

Это верно, что часть пути не может содержать период или много других специальных символов в этом отношении. Я испытал ту же проблему некоторое время назад и получил ответ от команды TechNet, заявляющей, что querystring является Вашей единственной опцией, которую находит можение.Прошу прощения

http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/d03c8331-1e98-4d5d-82a7-390942a93012/

3
ответ дан 14 December 2019 в 19:28
поделиться

У меня есть сервис почти с точной подписью. Я могу передать значения, которые имеют 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 + "'";
    }   
}
1
ответ дан 14 December 2019 в 19:28
поделиться

Вот пример 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);
    }
}
1
ответ дан 14 December 2019 в 19:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: