¿Existe una manera simple de tener múltiples UriTemplates en la misma definición?UriTemplate WCF
[WebGet(UriTemplate = "{id}")]
Por ejemplo, quiero/API/{id} y/API/{id}/para llamar a la misma cosa. No quiero que importe si hay/al final o no.
¿Existe una manera simple de tener múltiples UriTemplates en la misma definición?UriTemplate WCF
[WebGet(UriTemplate = "{id}")]
Por ejemplo, quiero/API/{id} y/API/{id}/para llamar a la misma cosa. No quiero que importe si hay/al final o no.
La manera más fácil que encontré para hacer esto es sobrecargar la función as explained here.
No es realmente simple, pero puede usar un selector de operación en su comportamiento para quitar el final '/', como en el ejemplo siguiente.
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();
}
}
hay de todos modos para hacer algo como esto: [WebGet (UriTemplate = "{id}, {id} /")] o [WebGet (UriTemplate = "{id} || {id} /")] – Adam
No, cada descripción de operación está asociada con una sola UriTemplate. Puede tener más de una operación (cada una con su propia plantilla), y en una de ellas simplemente llama a la otra. – carlosfigueira
sí - Esperaba evitar que de alguna manera ... hmm – Adam
esto es sólo parcialmente útiles, pero el nuevo WCF Web API biblioteca tiene una propiedad en la HttpBehavior llama TrailingSlashMode que puede ser configurado para omitir o redirigir.
¿Quiere decir '/ API/{id} y/API {id} /' o '/ API/{id} y/API/{id} /'? – Nate
ops sí ... corregirá ... ¡gracias! – Adam