Как удалить «SVC-» расширение в службы RESTful WCF?

голоса
50

В моем знании, RESTful WCF до сих пор «.svc» в его URL.

Например, если интерфейс сервиса, как

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

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

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

Задан 10/12/2008 в 06:41
источник пользователем
На других языках...                            


7 ответов

голоса
44

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

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

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

то ваши адреса будут выглядеть следующим образом:

http://servername/mysvc/value/2

НТН

Ответил 01/06/2012 в 00:26
источник пользователем

голоса
30

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

В 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);
            }
        };
    }
}

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

Ответил 10/12/2008 в 10:03
источник пользователем

голоса
4

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

Ответил 20/12/2008 в 04:20
источник пользователем

голоса
3

Существует также способ устранения физических SVC - файлов в целом. Это может быть сделано с VirtualPathProvider.

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

Ответил 15/01/2010 в 04:44
источник пользователем

голоса
2

В 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]
Ответил 15/01/2010 в 04:35
источник пользователем

голоса
2

Его легко на IIS 7 - использовать модуль URL Rewrite

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

Ответил 15/12/2008 в 23:24
источник пользователем

голоса
1

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

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

Это заменит / отдых / Service1 / arg1 / arg2 по /Service1.svc/arg1/arg2

Ответил 16/05/2015 в 11:47
источник пользователем

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