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

时间:2010-05-27 14:05:50

标签: .net wcf iis service

我正在尝试使用无扩展/ .svc-less 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是吐司。我无法用浏览器点击它(获得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);

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:36)

哇,我觉得愚蠢。

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

一旦我从配置中移回代码...并交换到这行代码:

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

我与一个提供WSDL和帮助页面的无扩展URL开展业务。

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

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

答案 1 :(得分:0)

我有同样的问题。您的解决方案适用于我的代码。我刚刚改变了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>