好的,所以我希望将单个服务公开为SOAP以及REST(Json)端点。由于它不在“WCF服务应用程序”模板中,因此我有一个web.config并将以下内容添加到...
的web.config
<configuration>
...
<system.serviceModel>
<services>
<service name="MySvcClass">
<endpoint address="" binding="webHttpBinding" contract="MySvcInterfaceClass" behaviorConfiguration="restBehavior" />
<endpoint address="soap" binding="basicHttpBinding" contract="MySvcInterfaceClass" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="restBehavior">
<webHttp helpEnabled="true"/>
</behavior>
</endpointBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true"/>
</system.serviceModel>
...
</configuration>
假设MySvcClass类在\ MySvcClass.svc中实现,以上公开......
原始终点
localhost\MySvcClass.svc\
(休息终点)
localhost\MySvcClass.svc\mex
(元数据交换使用下面的SOAP端点)
localhost\MySvcClass.svc\soap
(肥皂终点)
到目前为止,这么好(我想!)。
然后我想摆脱上面路径中看到的丑陋的“.svc”。所以我跟着这个MSDN blog post,并在我的...
的global.asax
void Application_Start(object sender, EventArgs e)
{
RouteTable.Routes.Add(new ServiceRoute("MySvcClass", new WebServiceHostFactory(), typeof(MySvcClass)));
}
有趣的是,当我在Application_Start中放置一个断点时,VS2010没有达到这个特定的断点 - 即使我停止 - >开始调试或停止 - >启动IIS应用程序池。离奇!无论如何,回到这一点,我现在可以访问上面列出的端点和服务
清洁终结点
localhost\MySvcClass\
(休息终点)
localhost\MySvcClass\mex
(元数据交换使用下面的SOAP端点)
localhost\MySvcClass\soap
(肥皂终点)
问题
[更新] 我也尝试过URL重写,但这会在保持REST端点活动的同时杀死SOAP端点。我做的是:在web.config中使用MS的URL Rewrite 2.0模块
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
<rewrite>
<rules>
<rule name="RemoveSvcExt" stopProcessing="true">
<match url="^MySvcClass(.*)$" />
<action type="Rewrite" url="MySvcClass.svc{R:1}" />
</rule>
</rules>
</rewrite>
</system.webServer>
然而,这会使Web应用程序处于某种不一致的状态,因为有些部分仍然坚持.svc
URL。例如:服务端点上的HTML帮助页面显示svcutil.exe http://localhost/MySvcClass.svc?wsdl
即使位于http://localhost/MySvcClass?wsdl
的干净位置的WSDL也会引用其中的http://localhost/MySvcClass.svc
- 这有效地杀死了SOAP端点。
这就是为什么我认为(0.02美元)重写只是一个问题。叹了口气,此时我正在与框架斗争以完成工作。它感觉到这样的时间燃烧......
答案 0 :(得分:0)
对于没有.svc的服务,在wcf中搜索文件少的激活 http://www.a2zdotnet.com/View.aspx?Id=188
答案 1 :(得分:0)
我有一个REST项目,因为暴露了REST和SOAP服务。现在,我为一些客户端访问的SOAP服务放置了一个.svc文件。
下面的屏幕截图给出了我的项目的文件夹结构,global.asax中的路由配置,访问Rest服务的输出以及访问.svc文件(SOAP服务)。要删除.svc扩展名,请使用URL重写模块。
请找到我的web.Config(我的应用程序托管在IIS上):
请找到我的实现我的接口ISampleService的类: