如何删除RESTful WCF服务中的“.svc”扩展名?

时间:2008-12-10 05:41:35

标签: wcf rest

据我所知,RESTful WCF的URL仍然有“.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”主机?

7 个答案:

答案 0 :(得分:46)

我知道这篇文章现在有点旧了,但是如果你碰巧使用.NET 4,你应该看一下使用URL Routing(在MVC中引入,但是带入了核心ASP.NET)。

在您的app start(global.asax)中,只需使用以下路由配置行来设置默认路由:

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

然后您的网址将如下所示:

http://servername/mysvc/value/2

HTH

答案 1 :(得分: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);
            }
        };
    }
}

如果不使用第三方ISAPI模块或通配符映射,如何在IIS 6中实现无扩展URL是一个很好的example

答案 2 :(得分:4)

以下是使用IIS 7重写模块或使用自定义模块的更详细信息: http://www.west-wind.com/Weblog/posts/570695.aspx

答案 3 :(得分:3)

还有一种方法可以完全消除物理.svc文件。这可以使用VirtualPathProvider完成。

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

答案 4 :(得分: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]

答案 5 :(得分:2)

在IIS 7上很容易 - 使用URL Rewrite Module

在IIS 6上,我发现最容易使用ISAPI Rewrite module,它允许您定义一组正则表达式,将请求Urls映射到.svc文件......

答案 6 :(得分:1)

将此添加到您的global.asax

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

这将由/Service1.svc/arg1/arg2

替换/ rest / Service1 / arg1 / arg2