UriTemplate WCF - PullRequest
       4

UriTemplate WCF

5 голосов
/ 20 мая 2011

Существует ли простой способ иметь несколько UriTemplates в одном и том же определении.

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

Например, я хочу, чтобы / API / {id} и / API / {id} / вызывали одну и ту же вещь.Я не хочу, чтобы это имело значение, есть / в конце или нет.

Ответы [ 3 ]

3 голосов
/ 20 мая 2011

Не очень просто, но вы можете использовать селектор операций в своем поведении, чтобы убрать завершающий символ '/', как в примере ниже.

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();
    }
}
1 голос
/ 28 мая 2011

Самый простой способ сделать это - перегрузить функцию , как описано здесь .

1 голос
/ 23 мая 2011

Это только частично полезно, но новая библиотека WCF Web API имеет свойство в HttpBehavior, называемое TrailingSlashMode, которое может быть установлено в Ignore или Redirect.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...