2008-12-10 73 views
50

據我所知,RESTful WCF的URL中仍然有「.svc」。如何刪除RESTful WCF服務中的「.svc」擴展名?

例如,如果服務接口是像

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

訪問URI是像 「http://machinename/Service.svc/Value/2」。根據我的理解,REST的一部分優勢是它可以隱藏實現細節。像「http://machinename/Service/value/2」這樣的RESTful URI可以由任何RESTful框架實現,但「http://machinename/Service.svc/value/2」公開它的實現是WCF。

如何刪除訪問URI中的「.svc」主機?

+1

另請參閱:http:// stackoverflow。com/questions/3662555/how-can-i-override-a-svc-file-in-my-routing-table – 2010-09-22 10:54:12

回答

30

在IIS 7中,您可以使用Url Rewrite Module,如本博客post中所述。

在IIS 6中,你可以寫一個http module將改寫網址:

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

而且還有一個不錯的example如何實現在IIS 6擴展名的URL,而無需使用第三方ISAPI模塊或通配符映射。

+0

+1謝謝,正是我在 – 2010-04-21 05:24:35

+0

之後int i = path.IndexOf('/',2 );必須是int i = path.LastIndexOf('/',2); – 2012-07-16 14:11:23

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] 
44

我知道現在這個職位是有點老了,但如果你碰巧使用.NET 4,你都應該看看使用URL路由(在MVC出臺,但進入核心ASP。淨)。

在您的應用程序啓動(Global.asax中),只是有以下路由配置線設置默認路由:

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

如果你的URL看起來像這樣:

http://servername/mysvc/value/2 

HTH

1

添加到您的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 by /Service1.svc/arg1/arg2