有没有一种简单的方法可以让多个UriTemplates在同一个定义中。
[WebGet(UriTemplate = "{id}")]例如,我希望/API/{id}和/API/{id}/调用相同的东西。我不希望有/在结尾有没有关系。
发布于 2011-05-28 11:29:13
我找到的最简单的方法是重载函数as explained here。
发布于 2011-05-20 23:30:48
不是很简单,但是你可以在你的行为中使用操作选择器来去掉尾随的'/',如下面的例子所示。
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();
}
}发布于 2011-05-23 09:38:25
这只是部分帮助,但是新的WCF Web API库在HttpBehavior上有一个名为TrailingSlashMode的属性,可以将其设置为忽略或重定向。
https://stackoverflow.com/questions/6073581
复制相似问题