我正在尝试在.NET 3.5中构建一个支持SOAP的C#服务 - 并显示WSDL和REST。
SOAP服务和WSDL生成很容易使用ServiceHost
和BasicHttpBinding
类。得到了这个工作,客户很高兴。
因为SOAP调用所有使用的简单参数,所以客户端开发人员为某些命令请求了REST接口。所以我将ServiceHost类更改为WebServiceHost
,添加了必要的WebInvoke
和WebGet
属性,添加了WebHttpBinding
类,并且bingo - REST和SOAP都在一个服务。很酷,改变一个界面,REST和SOAP都得到了新的东西。
但是有一个问题 - WSDL不再生成。我无法浏览到http://server/service?wsdl并获取WSDL文件。检查MSDN文档,这似乎是默认WebServiceHost
的行为。
问题:我可以覆盖此行为以便可以获取WSDL吗?没有与以前相同的URL - 它可以更改 - 但我只需要将一些URL用于服务以获取这些SOAP开发人员的WSDL。
答案 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请求的字符串类型。
任何解决方法?