2011-06-07 87 views
1

在运行时在占位符中提供空字符串时,WebInvokeAttribute和UriTemplate解析程序如何运行?带有空字符串的UriTemplate的WebInvoke

documentation似乎没有涵盖这一点。

在一些继承的代码中,我遇到了在空字符串传递时方法没有被正确解析的情况。与其他Web方法没有明显的冲突。

谢谢!

更新:

在UriTemplate如:"/{x}/{y}?z={z}",什么是,如果部分或全部值都设置为“”空字符串的行为,但是分隔符仍然存在,"/17/?z=""//apple?z=""//?z=%20""//?z="。另外,按照标准,浏览器允许在发送之前清理 URI吗?

回答

-2

空字符串表示该操作的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(); 
    } 
} 
+0

整个uri不为空字符串,运行时为空字符串值。 – 2011-06-07 16:54:24