2011-05-20 48 views
5

是否有一種簡單的方法可以在同一個定義中擁有多個UriTemplates。UriTemplate WCF

[WebGet(UriTemplate = "{id}")] 

例如,我希望/ API/{id}和/ API/{id} /調用相同的東西。如果最後有/沒有,我不希望它重要。

+0

您是指'/​​ API/{id}和/ API {id} /'或'/ API/{id}和/ API/{id} /'嗎? – Nate 2011-05-20 14:47:14

+0

ops yea ...將改正..謝謝! – Adam 2011-05-20 15:21:07

回答

3

不是很簡單,但您可以在您的行爲中使用操作選擇器去除尾部的「/」,如下例所示。

public class StackOverflow_6073581_751090 
{ 
    [ServiceContract] 
    public interface ITest 
    { 
     [WebGet(UriTemplate = "/API/{id}")] 
     string Get(string id); 
    } 
    public class Service : ITest 
    { 
     public string Get(string id) 
     { 
      return id; 
     } 
    } 
    public class MyBehavior : WebHttpBehavior 
    { 
     protected override WebHttpDispatchOperationSelector GetOperationSelector(ServiceEndpoint endpoint) 
     { 
      return new MySelector(endpoint); 
     } 

     class MySelector : WebHttpDispatchOperationSelector 
     { 
      public MySelector(ServiceEndpoint endpoint) : base(endpoint) { } 

      protected override string SelectOperation(ref Message message, out bool uriMatched) 
      { 
       string result = base.SelectOperation(ref message, out uriMatched); 
       if (!uriMatched) 
       { 
        string address = message.Headers.To.AbsoluteUri; 
        if (address.EndsWith("/")) 
        { 
         message.Headers.To = new Uri(address.Substring(0, address.Length - 1)); 
        } 

        result = base.SelectOperation(ref message, out uriMatched); 
       } 

       return result; 
      } 
     } 
    } 
    public static void Test() 
    { 
     string baseAddress = "http://" + Environment.MachineName + ":8000/Service"; 
     ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress)); 
     host.AddServiceEndpoint(typeof(ITest), new WebHttpBinding(), "").Behaviors.Add(new MyBehavior()); 
     host.Open(); 
     Console.WriteLine("Host opened"); 

     WebClient c = new WebClient(); 
     Console.WriteLine(c.DownloadString(baseAddress + "/API/2")); 
     Console.WriteLine(c.DownloadString(baseAddress + "/API/2/")); 

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

有沒有辦法這樣做: [WebGet(UriTemplate =「{id},{id}​​ /」)]或[WebGet(UriTemplate =「{id} || {id} /」)] – Adam 2011-05-20 15:34:20

+0

不,每個操作說明都與一個UriTemplate相關聯。你可以有多個操作(每個操作都有自己的模板),其中一個操作只需調用另一個操作。 – carlosfigueira 2011-05-20 15:46:09

+0

是的 - 我只是希望避免,不知何故...嗯 – Adam 2011-05-20 15:49:34

1

這只是部分有幫助的,但新的WCF Web API庫有一個屬性上HttpBehavior稱爲可以設置爲忽略或重定向TrailingSlashMode。

相關問題