ServiceRoute + WebServiceHostFactory 杀死 WSDL 生成?如何使用 ?wsdl 创建无扩展 WCF 服务

Posted

技术标签:

【中文标题】ServiceRoute + WebServiceHostFactory 杀死 WSDL 生成?如何使用 ?wsdl 创建无扩展 WCF 服务【英文标题】:ServiceRoute + WebServiceHostFactory kills WSDL generation? How to create extensionless WCF service with ?wsdl 【发布时间】:2011-02-24 16:39:58 【问题描述】:

我正在尝试使用无扩展名/无 .svc 的 WCF 服务。其他人可以确认或否认我遇到的问题吗?

我在代码中使用路由,并在 global.asax.cs 的 Application_Start 中执行此操作:

RouteTable.Routes.Add(new ServiceRoute("Data", new WebServiceHostFactory(), typeof(DataDips)));

我已经在 IIS 6 和 IIS 7.5 中进行了测试,我可以很好地使用该服务(即我的无扩展通配符映射处理程序配置正确指向 ASP.NET)。但是,元数据生成完全搞砸了。我可以使用 WCF 测试客户端(我假设是 svcutil.exe)访问我的 /mex 端点——但是您通常使用 .svc 获得的 ?wsdl 生成是 toast。我不能用浏览器点击它(得到 400 错误请求),我不能用 wsdl.exe 等点击它。在 web.config 中正确配置了元数据生成。

这当然是个问题,因为服务是作为 basicHttpBinding 公开的,所以旧式 ASMX 客户端可以访问它。但是当然,客户端不能在没有 WSDL 描述的情况下生成代理。

如果我像这样在配置中使用 serviceActivation 路由,而不是在代码中注册路由:

<serviceHostingEnvironment aspNetCompatibilityEnabled="true">
  <serviceActivations>
    <add relativeAddress="Data.svc" service="DataDips" />
  </serviceActivations>
</serviceHostingEnvironment>

然后瞧……它起作用了。

但是我没有一个干净的无扩展网址。如果我将 relativeAddress 从 Data.svc 更改为 Data,那么我会得到一个配置异常,因为 config 不支持。 (必须使用注册到 WCF 的扩展)。

我也尝试将此代码与上述配置结合使用:

RouteTable.Routes.MapPageRoute("","Data/*data","~/Data.svc/*data",false);

我的想法是,我可以将无扩展名 url 指向配置的 .svc url。这不起作用 - /Data.svc 继续工作,但 /Data 返回 404。

如果在这样的配置中使用 urlMappings 并结合上面的 serviceActivation,我确实找到了解决方法:

<urlMappings>
   <add url="~/Data" mappedUrl="Data.svc"/>
</urlMappings>

这个问题是双重的 - 1. 看起来很复杂 2. 在生成的 WSDL 中,操作端点仍然引用 Data.svc/,而不是 Data/——因此对 Data.svc 实际存在/响应存在依赖。

这不是我真正想要的,即使它有点/有点解决了问题。

是否有正确的方法来获取无扩展的 WCF 服务 URL 以正确生成 WSDL?

【问题讨论】:

这里的分步说明:***.com/a/27850224/276949 【参考方案1】:

哇,我是不是觉得自己很笨。

我应该使用 ServiceHostFactory 托管我的服务,而不是 WebServiceHostFactory。

当我从 config... 移回代码并切换到这行代码时:

RouteTable.Routes.Add(new ServiceRoute("Data", new ServiceHostFactory(), typeof(DataDips)));

我的业务是使用提供 WSDL 和帮助页面的无扩展 URL。

太糟糕了,我在这上面浪费了这么多时间。我使用 WebServiceHostFactory 是个意外,但 MSDN 的工厂页面上没有关于功能减少的免责声明。 (我认为删除 WSDL 是有道理的,但删除帮助页面没有意义,因为如果存在具有该名称的 REST 操作,它们可以简单地在配置中提供一个属性来重命名“帮助”页面......叹息)。

WebServiceHost 文档中有一条注释 http://msdn.microsoft.com/en-us/library/system.servicemodel.web.webservicehost.aspx

【讨论】:

仍然是一个有效的问题。我只是做了同样的事情,并在这里找到了答案等着我。谢谢! 是的,一个有效的问题。我想做同样的事情,这很奏效。 我现在的建议...抛弃 WCF!到处都是这样的地雷太复杂了。考虑到它多年来给我带来的所有不必要的痛苦,我终于放弃了它,并且对我现在使用的东西感到非常满意。我 100% 落后于 ServiceStack 至少已经使用了一年 - 它很棒,它干净,当您重新访问旧代码时很有意义,支持开箱即用的多种序列化格式,支持 IoC,在内部轻松托管 /在 IIS(包括 Mono)之外,不会让您陷入配置地狱,并且会经常更新。 我刚刚启动了一个 WCF 服务...一直在使用多个 rest/ws 端点...ServiceStack 在 Windows azure 上运行良好吗? 对于外行... ServiceStack 现在是付费产品,而且许可证...嗯...不好。【参考方案2】:

我也有同样的问题。您的解决方案适用于我的代码。我只是像这样更改了 Global.asax:

<%@ Application Language="C#" %>
<%@ Import Namespace="System.Web.Routing" %>
<%@ Import Namespace="System.ServiceModel.Activation" %>
<%@ Import Namespace="System.ServiceModel.Web " %>

<script RunAt="server">
    void Application_Start(object sender, EventArgs e)
    
        RegisterRoutes(RouteTable.Routes);
    

    private void RegisterRoutes(RouteCollection routes)
    
        routes.Add(new ServiceRoute("URLWithoutSVC", new WebServiceHostFactory(), typeof(Service))); 
   
</script>

<%@ Application Language="C#" %>
<%@ Import Namespace="System.Web.Routing" %>
<%@ Import Namespace="System.ServiceModel.Activation" %>
<%@ Import Namespace="System.ServiceModel.Web " %>

<script RunAt="server">
    void Application_Start(object sender, EventArgs e)
    
        RegisterRoutes(RouteTable.Routes);
    

    private void RegisterRoutes(RouteCollection routes)
    
        routes.Add(new ServiceRoute("URLWithoutSVC", new ServiceHostFactory(), typeof(Service))); 
   
</script>

【讨论】:

以上是关于ServiceRoute + WebServiceHostFactory 杀死 WSDL 生成?如何使用 ?wsdl 创建无扩展 WCF 服务的主要内容,如果未能解决你的问题,请参考以下文章

webservice

如何有delphi5调用webservice,别人写的webservice?

如何在网页中调用webservice?

webservice是啥

如何调用webservice

如何用java调用cxf webservice接口