2009-11-13 86 views
11

我想在.NET 3.5中构建一个支持SOAP的C#服务,并显示WSDL和REST。使单个WCF服务同时支持SOAP,REST和WSDL

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

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

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

问题:我可以重写此行为以便可以获取WSDL吗?不必像以前那样使用相同的URL - 它可以更改 - 但我只需要有一些URL可用于为这些SOAP开发人员获取WSDL。

+0

你好贾森,我很想知道你是否仍在使用这种方法,以及它是如何工作或不为你工作的。你是否发现你必须复制支持两者的任何方法(核心逻辑)? – schmoopy 2012-01-26 20:08:22

+0

我只需要创建两个端点并为每个命令添加一个额外的属性。 – 2012-01-26 20:28:02

+0

解决方案的类似问题。 http://social.msdn.microsoft.com/Forums/en/wcf/thread/845d0bbd-52b4-420f-bf06-793d53ef93ba – maciejW 2010-10-17 01:47:56

回答

4

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

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

+0

我在代码中完成所有配置,而不是配置文件。 一个解决方案是使用两个端点 - 并且该解决方案确实工作得很好。我希望能够使用单个端点;单个端口和根URL。 – 2009-11-13 20:06:11

+1

我不认为你可以从WebHttpBinding端点获取WSDL。 – 2009-11-13 20:09:18

4

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

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

REST期间没有WSDL。无法打开或任何 - 它不存在。

目前正在做一些努力来提供类似的东西 - 称为WADL(Web应用程序描述语言),但据我所知,它通过任何方式还远未达到既定标准。另见:Do we need WADL

+0

我可以理解REST没有WSDL,但请记住该服务同时处理REST和SOAP请求。只是SOAP客户端不能再请求WSDL。目标是拥有一个单一的监听端口的服务,它可以为REST,SOAP和WSDL提供服务,所有服务都基于URL路径。 – 2009-11-16 15:53:51

0

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

我创建了一个类似的项目,一个公开SOAP和REST风格的端点,并启用此通过,像你一样,修改界面,例如:

// 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请求都是字符串类型。

有没有办法解决这个问题?

+0

有没有办法公开在SOAP和REST中完全相同的方法,而不是为每个旧的soap方法添加新的方法? – 2015-11-11 03:52:02