WebInvoke с UriTemplate с пустыми строками - PullRequest
1 голос
/ 07 июня 2011

Как ведут себя преобразователь WebInvokeAttribute и UriTemplate, если во время выполнения поставляются с пустыми строками в заполнителях?

Документация , по-видимому, не охватывает это.некоторый унаследованный код, я получаю ситуации, когда методы не разрешаются должным образом, когда передаются пустые строки.Нет очевидного конфликта с другими веб-методами.

Спасибо!

Обновление:

В UriTemplate, таком как: "/{x}/{y}?z={z}", каково поведение, если некоторые или всезначения предоставляются как "" пустые строки, но разделители остаются, "/17/?z=", "//apple?z=", "//?z=%20", "//?z=".Кроме того, по умолчанию браузеры могут очищать URI перед их отправкой?

1 Ответ

0 голосов
/ 07 июня 2011

Пустая строка означает, что URI для операции расположен по тому же адресу, что и конечная точка - для получения дополнительной информации см. Пример ниже.

public class StackOverflow_6267866
{
    [ServiceContract]
    public interface ITest1
    {
        [WebInvoke(UriTemplate = "")]
        string EchoString(string text);
    }
    [ServiceContract]
    public interface ITest2
    {
        [WebInvoke(UriTemplate = "", BodyStyle = WebMessageBodyStyle.WrappedRequest)]
        int Add(int x, int y);
    }
    public class Service : ITest1, ITest2
    {
        public string EchoString(string text)
        {
            return text;
        }

        public int Add(int x, int y)
        {
            return x + y;
        }
    }
    static void SendPostRequest(string uri, string contentType, string body)
    {
        HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(uri);
        req.Method = "POST";
        req.ContentType = contentType;
        byte[] bodyBytes = Encoding.UTF8.GetBytes(body);
        req.GetRequestStream().Write(bodyBytes, 0, bodyBytes.Length);
        req.GetRequestStream().Close();

        HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
        Console.WriteLine("HTTP/{0} {1} {2}", resp.ProtocolVersion, (int)resp.StatusCode, resp.StatusDescription);
        foreach (string headerName in resp.Headers.AllKeys)
        {
            Console.WriteLine("{0}: {1}", headerName, resp.Headers[headerName]);
        }
        Console.WriteLine();
        Stream respStream = resp.GetResponseStream();
        Console.WriteLine(new StreamReader(respStream).ReadToEnd());
        Console.WriteLine();
        Console.WriteLine("  *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*  ");
        Console.WriteLine();
    }
    public static void Test()
    {
        string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
        ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress));
        host.AddServiceEndpoint(typeof(ITest1), new WebHttpBinding(), "ITest1").Behaviors.Add(new WebHttpBehavior());
        host.AddServiceEndpoint(typeof(ITest2), new WebHttpBinding(), "ITest2").Behaviors.Add(new WebHttpBehavior());
        host.Open();
        Console.WriteLine("Host opened");

        SendPostRequest(baseAddress + "/ITest1", "application/json", "\"hello world\"");
        SendPostRequest(baseAddress + "/ITest1/", "application/json", "\"hello world\"");
        SendPostRequest(baseAddress + "/ITest2", "application/json", "{\"x\":123,\"y\":456}");
        SendPostRequest(baseAddress + "/ITest2/", "application/json", "{\"x\":123,\"y\":456}");

        Console.Write("Press ENTER to close the host");
        Console.ReadLine();
        host.Close();
    }
}
...