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

Posted

技术标签:

【中文标题】如何删除 RESTful WCF 服务中的“.svc”扩展名?【英文标题】:How to remove the ".svc" extension in RESTful WCF service? 【发布时间】:2010-09-26 04:35:49 【问题描述】:

据我所知,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”主机?

【问题讨论】:

参见:***.com/questions/3662555/… 【参考方案1】:

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

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

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

那么您的网址将如下所示:

http://servername/mysvc/value/2

HTH

【讨论】:

更清洁的解决方案。谢谢! 最佳解决方案(如果使用4.0) 这在 asp.net mvc 4 中失败,因为 mvc 生成的所有其他链接现在都将指向该服务。 如果您的项目不存在,请不要忘记在您的项目中添加对System.ServiceModel.Activation 的引用。 (VS2012 中的默认 WCF 项目似乎没有包含这个) 别忘了将它添加到 Global.asax.cs:using System.Web.Routing; using System.ServiceModel.Activation;【参考方案2】:

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

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

还有一个很好的example 如何在不使用第三方 ISAPI 模块或通配符映射的情况下在 IIS 6 中实现无扩展 url。

【讨论】:

int i = path.IndexOf('/', 2);必须是 int i = path.LastIndexOf('/', 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 Rewrite module 最简单,它允许您定义一组将请求 URL 映射到 .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/Service1/arg1/arg2 替换为 /Service1.svc/arg1/arg2

【讨论】:

以上是关于如何删除 RESTful WCF 服务中的“.svc”扩展名?的主要内容,如果未能解决你的问题,请参考以下文章

WCF RESTFul服务中的异常处理

如何理解一个服务调用是“Restful 服务调用”还是“标准 wcf 调用”?

如何对 WCF 4 RESTful 服务进行身份验证?

RESTful WCF 服务返回“找不到资源”。错误

如何在 WCF RESTful 服务上启用 HTTPS?

如何使用用户名/密码 + SSL 使用 WCF 配置安全 RESTful 服务