我正在尝试使用无扩展名/无 .svc WCF 服务。其他人可以确认或否认我遇到的问题吗?
我在代码中使用路由,并在 global.asax.cs 的 Application_Start 中执行此操作:
RouteTable.Routes.Add(new ServiceRoute("Data", new WebServiceHostFactory(), typeof(DataDips)));
我已经在 IIS 6 和 IIS 7.5 中进行了测试,并且可以很好地使用该服务(即我的无扩展通配符映射处理程序配置正确指向 ASP.NET)。然而,元数据生成完全搞砸了。我can使用 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>
然后瞧...它起作用了。
但我没有一个干净的无扩展网址。如果我将相对地址从 Data.svc 更改为 Data,则会出现配置异常,因为配置不支持此操作。 (必须使用注册到 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?