2011-06-07 6 views
1

Comment le résolveur WebInvokeAttribute et UriTemplate se comportent-ils lorsqu'ils sont fournis avec des chaînes vides dans des espaces réservés lors de l'exécution? Le documentation ne semble pas couvrir cela.WebInvoke avec UriTemplate avec des chaînes vides

Dans certains codes hérités, j'obtiens des situations où les méthodes ne sont pas résolues correctement lorsque des chaînes vides sont passées. Il n'y a pas de conflit évident avec d'autres méthodes Web.

Merci!

Mise à jour:

Dans un UriTemplate tels que: "/{x}/{y}?z={z}", quel est le comportement si certaines ou toutes les valeurs sont fournies en tant que « » chaînes vides, mais les délimiteurs restent, "/17/?z=", "//apple?z=", "//?z=%20", "//?z=". En outre, par défaut, les navigateurs sont-ils autorisés à à nettoyer URI avant de les envoyer?

Répondre

-2

La chaîne vide signifie que l'URI de l'opération est située à la même adresse que l'extrémité - voir l'exemple ci-dessous pour plus d'informations.

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

Chaîne non vide pour l'ensemble de l'URI, valeurs de chaînes vides lors de l'exécution. –

Questions connexes