Como remover a extensão ".svc" em serviço RESTful WCF?

votos
50

No meu conhecimento, a RESTful WCF ainda tem .svc em sua URL.

Por exemplo, se a interface do serviço é como

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

O acesso URI é como http: //machinename/Service.svc/Value/2 . No meu entendimento, parte da vantagem REST é que ele pode esconder os detalhes de implementação. A URI RESTful como http: // machinename / Serviço / valor / 2 pode ser implementado por qualquer framework RESTful, mas um http: //machinename/Service.svc/value/2 expõe a sua implementação é WCF.

Como posso remover este alojamento .svc no acesso URI?

Publicado 10/12/2008 em 06:41
fonte usuário
Em outras línguas...                            


7 respostas

votos
44

Eu sei que este post é um pouco velho agora, mas se acontecer de você estar usando .NET 4, você deve olhar para usar URL Routing (introduzido no MVC, mas trouxe no núcleo ASP.NET).

Em seu início aplicativo (global.asax), apenas tem a seguinte linha de configuração de rota para configurar a rota padrão:

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

em seguida, suas URLs ficaria assim:

http://servername/mysvc/value/2

HTH

Respondeu 01/06/2012 em 00:26
fonte usuário

votos
30

No IIS 7, você pode usar o módulo de reescrita de URLs , como explicado neste blog pós .

No IIS 6, você poderia escrever um módulo http que irá reescrever o 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);
            }
        };
    }
}

E há um bom exemplo como conseguir urls sem extensão em IIS 6 sem o uso de módulos de ISAPI de terceiros ou mapeamento de curinga.

Respondeu 10/12/2008 em 10:03
fonte usuário

votos
4

Aqui está mais informações detalhadas usando o Rewrite Module IIS 7, ou usando um módulo personalizado: http://www.west-wind.com/Weblog/posts/570695.aspx

Respondeu 20/12/2008 em 04:20
fonte usuário

votos
3

Há também uma maneira de eliminar os arquivos .svc físicas completamente. Isso pode ser feito com um VirtualPathProvider.

Veja: http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/350f2cb6-febd-4978-ae65-f79735d412db

Respondeu 15/01/2010 em 04:44
fonte usuário

votos
2

Em IIS6 ou 7, você pode usar RIFI , um filtro de reescrita livre. Aqui está a regra que eu usei:

# 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]
Respondeu 15/01/2010 em 04:35
fonte usuário

votos
2

É fácil no IIS 7 - usar um módulo URL Rewrite

No IIS 6 I encontrou o seu mais fácil de usar o módulo ISAPI Rewrite que permite definir um conjunto de expressões regulares que mapeiam as URLs solicitação para o arquivo .svc ...

Respondeu 15/12/2008 em 23:24
fonte usuário

votos
1

Adicione isto a sua global.asax

private void Application_BeginRequest(object sender, EventArgs e)
{
    Context.RewritePath(System.Text.RegularExpressions.Regex.Replace(
               Request.Path, "/rest/(.*)/", "/$1.svc/"));
}

Isso irá substituir / rest / Service1 / arg1 / arg2 por /Service1.svc/arg1/arg2

Respondeu 16/05/2015 em 11:47
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more