我有一个SOAP服务的WSDL定义,我已经使用SvcUtil从它成功生成了* .cs文件。
实现客户端非常简单 - 我只需要从生成的* .cs中调用必要的函数即可。
实现服务器似乎更复杂。据我所知,我需要从生成的* .cs实现一个接口,然后使用一些魔法将其转换为Web服务器。
但我不需要新的Web服务器,我已经有一个用C#编写的Web服务器,它已经有许多与我需要实现的SOAP服务无关的功能。我不想创建另一个Web服务器,但我希望我的SOAP服务只是我现有应用程序(服务器)的一部分,这是我的服务器可以回答的问题。请求http://example.com/request1
,http://example.com/request2
等等,我希望这个SOAP服务只是http://example.com/request3
。
由于HTTP已经由我的服务器处理,我不需要.NET来为我处理它,基本上我的服务器可以接受客户端连接并根据URL调用必要的处理程序。我有一个SOAP请求的处理程序,看起来大概是这样的:
MyResponse HandleSOAPRequest(MyRequest request)
{
// 1. parse soap message from request.body
// 2. process it
// 3. generate response, serialize it in SOAP format and return it
}
问题是 - 我可以依赖WSDL定义和.NET库吗?
目前我正在使用XDocument解析SOAP请求并手动从中提取字段并使用简单的字符串连接进行序列化。使用.NET内置函数来序列化或解析XML并不起作用。也就是说,如果我尝试序列化生成的* .cs文件中定义的类的对象的响应,那么生成的XML与协议所期望的不同,类似地,如果我尝试将请求解析为定义的类的对象在生成的* .cs文件中,我收到错误,因为XML解析器需要不同的格式。这适用于SoapFormatter和XmlSerializer。
由于.NET可以实现客户端,这意味着已经实现了解析和序列化SOAP消息所需的所有内容,我只需要弄清楚如何使用此功能。
ServiceModel的documentation非常有帮助。
答案 0 :(得分:0)
最简单的方法是通过ServiceHost
:
ServiceHost host = new ServiceHost(typeof(YourService));
host.Open();
(我假设这里的配置来自app.config
,并且不会像下面的链接示例那样在代码中设置。)
How to: Expose a Contract to SOAP and Web Clients
唯一的缺点是应用程序必须以管理员权限运行,否则需要一个奇怪的配置。