使单个WCF服务支持SOAP,REST和WSDL

时间:2009-11-13 19:41:05

标签: c# wcf rest soap wsdl

我正在尝试在.NET 3.5中构建一个支持SOAP的C#服务 - 并显示WSDL和REST。

SOAP服务和WSDL生成很容易使用ServiceHostBasicHttpBinding类。得到了这个工作,客户很高兴。

因为SOAP调用所有使用的简单参数,所以客户端开发人员为某些命令请求了REST接口。所以我将ServiceHost类更改为WebServiceHost,添加了必要的WebInvokeWebGet属性,添加了WebHttpBinding类,并且bingo - REST和SOAP都在一个服务。很酷,改变一个界面,REST和SOAP都得到了新的东西。

但是有一个问题 - WSDL不再生成。我无法浏览到http://server/service?wsdl并获取WSDL文件。检查MSDN文档,这似乎是默认WebServiceHost的行为。

问题:我可以覆盖此行为以便可以获取WSDL吗?没有与以前相同的URL - 它可以更改 - 但我只需要将一些URL用于服务以获取这些SOAP开发人员的WSDL。

3 个答案:

答案 0 :(得分:4)

当你说“添加一个WebHttpBinding类”时,听起来你在代码中进行了很多配置而不是在配置文件中。

如果是这种情况,您可以尝试将配置移动到配置文件。然后为合同创建2个端点,一个REST和一个SOAP,具有2个不同的地址和绑定。

答案 1 :(得分:4)

  

但有一个问题 - 不再是WSDL了   得到了。我无法浏览   http://server/service?wsdl并获得   WSDL文件。检查MSDN文档,   这似乎是一个行为   默认WebServiceHost。

是的 - 这是REST的缺点之一 - 没有更多的WSDL,没有更多机器可读的服务描述。您需要希望服务提供商为您提供可用且最新的文档。

REST没有WSDL期间。不能打开或任何东西 - 它只是不存在。

目前正在努力提供类似的东西 - 称为WADL(Web应用程序描述语言),但据我所知,它仍远未达到既定标准。另请参阅:Do we need WADL

答案 2 :(得分:0)

大约在2007年,WSDL v2.0应该能够描述RESTful服务。我发现使用.Net v4.0中的WCF,从纯RESTful服务生成的WDSL无效(WSDL v1.0?)。

我创建了一个类似的项目,它暴露了SOAP和RESTful端点,并且正如您所做的那样,通过修改接口来启用它:

    // Get all Categories - complex object response
    [OperationContract]                             // categories
    [WebGet(BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "GetAllCategories")]
    CategoryCollection GetAllCategories();          // SubSonic object
    [OperationContract]                             // categories - respond with a JSON object
    [WebGet(ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "GetAllCategories.JSON")]
    CategoryCollection GetAllCategoriesJSON();      // SubSonic object

有一点需要注意的是,现在所有输入参数必须是所有SOAP请求的字符串类型。

任何解决方法?