2008-12-10 16 views
50

En mi conocimiento, RESTful WCF todavía tiene ".svc" en su URL.¿Cómo eliminar la extensión ".svc" en el servicio RESTful WCF?

Por ejemplo, si la interfaz de servicio es como

[OperationContract] 
[WebGet(UriTemplate = "/Value/{value}")] 
string GetDataStr(string value); 

El acceso URI 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 URI RESTful 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?

+1

Ver también: http: // stackoverflow.com/questions/3662555/how-can-i-override-a-svc-file-in-my-routing-table –

Respuesta

30

En IIS 7 puede usar el Url Rewrite Module como se explica en este blog post.

En IIS 6 se podría escribir un http module 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 las URL sin extensión en IIS 6 sin necesidad de utilizar módulos ISAPI de terceros o asignación de comodín.

+0

+1 gracias, exactamente lo que buscaba –

+0

int i = path.IndexOf ('/', 2); debe ser int i = ruta.LastIndexOf ('/', 2); –

2

Su fácil en IIS 7 - utilizar un URL Rewrite Module

En IIS 6 He encontrado la manera más fácil de utilizar la ISAPI Rewrite module que le permite definir un conjunto de expresiones regulares que se asignan las direcciones URL de solicitud para el archivo .svc ...

2

En IIS 6 o 7, puede utilizar IIRF, un filtro de reescritura libre. Esta es 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] 
44

Sé que este post es un poco viejo ahora, pero si le toca estar utilizando .NET 4, se debe buscar en el uso de enrutamiento de URL (introducido en MVC, pero criado en el núcleo ASP. RED).

En el inicio de aplicaciones (global.asax), solo tienen la siguiente línea de configuración de las rutas para configurar la ruta por defecto:

RouteTable.Routes.Add(new ServiceRoute("mysvc", new WebServiceHostFactory(), typeof(MyServiceClass))); 

entonces sus URL se vería así:

http://servername/mysvc/value/2 

HTH

+0

éste funciona para mí :) – lante

+2

Una solución mucho más limpia. ¡Gracias! – smdrager

+1

La mejor solución (si se usa 4.0) – schmoopy

1

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á/reposo/Service1/arg1/arg2 por /Service1.svc/arg1/arg2

Cuestiones relacionadas