example - ¿Cómo eliminar la extensión ".svc" en el servicio RESTful WCF?
wcf service c# example (7)
Agregue esto a su global.asax
private void Application_BeginRequest(object sender, EventArgs e)
{
Context.RewritePath(System.Text.RegularExpressions.Regex.Replace(
Request.Path, "/rest/(.*)/", "/$1.svc/"));
}
Esto reemplazará / rest / Service1 / arg1 / arg2 por /Service1.svc/arg1/arg2
En mi conocimiento, RESTful WCF todavía tiene ".svc" en su URL.
Por ejemplo, si la interfaz de servicio es como
[OperationContract]
[WebGet(UriTemplate = "/Value/{value}")]
string GetDataStr(string value);
El URI de acceso es como " http://machinename/Service.svc/Value/2 ". Según entiendo, parte de la ventaja de REST es que puede ocultar los detalles de la implementación. Un RESTful URI como " http://machinename/Service/value/2 " puede ser implementado por cualquier marco RESTful, pero un " http://machinename/Service.svc/value/2 " expone su implementación es WCF.
¿Cómo puedo eliminar este host ".svc" en el URI de acceso?
Aquí hay información más detallada usando el Módulo de Reescritura de IIS 7, o usando un módulo personalizado: http://www.west-wind.com/Weblog/posts/570695.aspx
En IIS 7 puede usar el Módulo de reescritura de URL como se explica en esta publicación de blog.
En IIS 6 puede escribir un módulo http que reescribirá la url:
public class RestModule : IHttpModule
{
public void Dispose() { }
public void Init(HttpApplication app)
{
app.BeginRequest += delegate
{
HttpContext ctx = HttpContext.Current;
string path = ctx.Request.AppRelativeCurrentExecutionFilePath;
int i = path.IndexOf(''/'', 2);
if (i > 0)
{
string svc = path.Substring(0, i) + ".svc";
string rest = path.Substring(i, path.Length - i);
ctx.RewritePath(svc, rest, ctx.Request.QueryString.ToString(), false);
}
};
}
}
Y hay un buen example cómo lograr URLs sin extensión en IIS 6 sin usar módulos ISAPI de terceros o mapeo de comodines.
En IIS6 o 7, puede usar IIRF , un filtro de reescritura gratuito. Aquí está la regla que utilicé:
# Iirf.ini
#
RewriteEngine ON
RewriteLog c:/inetpub/iirfLogs/iirf-v2.0.services
RewriteLogLevel 3
StatusInquiry ON RemoteOk
CondSubstringBackrefFlag *
MaxMatchCount 10
# remove the .svc tag from external URLs
RewriteRule ^/services/([^/]+)(?<!/.svc)/(.*)$ /services/$1.svc/$2 [L]
Es fácil en IIS 7: utilizar un módulo de reescritura de URL
En IIS 6 encontré que es más fácil usar el módulo de reescritura de ISAPI, que le permite definir un conjunto de expresiones regulares que correlacionan las Urls de solicitud con el archivo .svc ...
Sé que esta publicación ya es un poco antigua, pero si usa .NET 4, debería usar el enrutamiento de URL (introducido en MVC, pero incluido en el núcleo de ASP.NET).
En el inicio de su aplicación (global.asax), solo tiene la siguiente línea de configuración de ruta para configurar la ruta predeterminada:
RouteTable.Routes.Add(new ServiceRoute("mysvc", new WebServiceHostFactory(), typeof(MyServiceClass)));
entonces sus URL se verían así:
http://servername/mysvc/value/2
HTH
También hay una manera de eliminar los archivos .svc físicos por completo. Esto se puede hacer con un VirtualPathProvider
.
Ver: http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/350f2cb6-febd-4978-ae65-f79735d412db