Как удалить расширение ".svc" в службе RESTful WCF? - PullRequest
51 голосов
/ 10 декабря 2008

Насколько мне известно, RESTful WCF все еще имеет ".svc" в своем URL.

Например, если интерфейс службы похож на

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

URI доступа имеет вид "http://machinename/Service.svc/Value/2".. В моем понимании, преимущество REST заключается в том, что он может скрывать детали реализации. URI типа RESTful типа" http://machinename/Service/value/2" может быть реализован любой средой RESTful. , но "http://machinename/Service.svc/value/2" выставляет свою реализацию WCF.

Как я могу удалить этот хост ".svc" в URI доступа?

Ответы [ 7 ]

46 голосов
/ 01 июня 2012

Я знаю, что этот пост уже устарел, но если вы используете .NET 4, вам стоит взглянуть на использование маршрутизации URL (введено в MVC, но введено в ядро ​​ASP.NET).

При запуске приложения (global.asax) просто введите следующую строку конфигурации маршрута, чтобы настроить маршрут по умолчанию:

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

тогда ваши URL будут выглядеть так:

http://servername/mysvc/value/2

НТН

30 голосов
/ 10 декабря 2008

В IIS 7 вы можете использовать Модуль перезаписи Url , как описано в этом блоге post .

В IIS 6 вы можете написать http-модуль , который перезапишет 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);
            }
        };
    }
}

И есть пример , как получить URL без расширений в IIS 6 без использования сторонних модулей ISAPI или подстановочного сопоставления.

4 голосов
/ 20 декабря 2008

Вот более подробная информация, используя модуль перезаписи IIS 7 или пользовательский модуль: http://www.west -wind.com / Weblog / сообщений / 570695.aspx

3 голосов
/ 15 января 2010

Существует также способ полностью исключить физические файлы .svc. Это можно сделать с помощью VirtualPathProvider.

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

2 голосов
/ 15 января 2010

В IIS6 или 7 вы можете использовать IIRF , бесплатный фильтр перезаписи. Вот правило, которое я использовал:

# 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]
2 голосов
/ 16 декабря 2008

Легко в IIS 7 - используйте Модуль перезаписи URL

В IIS 6 я обнаружил, что проще всего использовать модуль перезаписи ISAPI , который позволяет определить набор регулярных выражений, которые сопоставляют URL-адреса запроса с файлом .svc ...

1 голос
/ 16 мая 2015

Добавьте это в ваш global.asax

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

Это заменит / rest / Service1 / arg1 / arg2 на /Service1.svc/arg1/arg2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...