Как удалить расширение .svc в службе RESTful WCF?
Насколько мне известно, 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 доступа?
Ответы
Ответ 1
В IIS 7 вы можете использовать Url Rewrite Module, как описано в этом блоге пост.
В IIS 6 вы можете написать http module, который будет переписывать 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 или подстановочного сопоставления.
Ответ 2
Я знаю, что этот пост сейчас немного устарел, но если вы используете .NET 4, вы должны посмотреть на URL-маршрутизацию (представленную в MVC, но представленную в основном ASP.NET).
В вашем старте приложения (global.asax) просто укажите следующую строку конфигурации маршрута, чтобы настроить маршрут по умолчанию:
RouteTable.Routes.Add(new ServiceRoute("mysvc", new WebServiceHostFactory(), typeof(MyServiceClass)));
тогда ваши URL-адреса выглядят следующим образом:
http://servername/mysvc/value/2
НТН
Ответ 3
Здесь более подробная информация с использованием модуля перезаписи IIS 7 или с использованием настраиваемого модуля:
http://www.west-wind.com/Weblog/posts/570695.aspx
Ответ 4
Существует также способ полностью исключить физические .svc файлы. Это можно сделать с помощью VirtualPathProvider
.
Смотрите: http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/350f2cb6-febd-4978-ae65-f79735d412db
Ответ 5
Легко на IIS 7 - используйте URL Rewrite Module
В IIS 6 мне было проще использовать модуль перезаписи ISAPI, который позволяет вам определить набор регулярных выражений, которые отображают запрос Urls к файлу .svc...
Ответ 6
В 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]
Ответ 7
Добавьте это в свой global.asax
private void Application_BeginRequest(object sender, EventArgs e)
{
Context.RewritePath(System.Text.RegularExpressions.Regex.Replace(
Request.Path, "/rest/(.*)/", "/$1.svc/"));
}
Это заменит /rest/Service 1/arg1/arg2 на/Service1.svc/arg1/arg2