我有一个基于BizTalk的WCF服务,我不知道它是如何部署或生成的,但据我所知它是使用BizTalk向导发布WCF服务。问题是BizTalk服务器安装已被删除,现在服务仍然在这里,但它不起作用,当我调用URL服务响应异常时:BizTalk接收位置可能被禁用。我需要生成一个WCF服务以替换该服务。我有一个示例请求和响应以及带有服务的文件夹,包含很多东西,XML,定义等,但是没有DLL。 SVC标记引用了BizTalk逻辑。
<%@ ServiceHost Language="c#" Factory="Microsoft.BizTalk.Adapter.Wcf.Runtime.WSHttpWebServiceHostFactory, Microsoft.BizTalk.Adapter.Wcf.Runtime, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" %>
所以这是我的问题,是否有人知道如何根据请求或响应生成服务以取代服务。
答案 0 :(得分:2)
如果您只有请求和响应xml,那么它有点棘手。即使您设法重新创建服务,也无法保证现有服务使用者能够继续调用服务而不进行任何更改。但是,如果你想要去,这个粗略的指南将有所帮助:
从soap请求和响应中提取操作签名
这应该很简单。只需查看定义SOAP主体的请求xml部分即可。举个例子:
<soap:Body xmlns:m="http://www.bookshop.com/prices">
<m:GetBookPrice>
<param1 xsi:type="xs:string">Metro 2033</param1>
</m:GetBookPrice>
</soap:Body>
这表明操作名称名为GetBookPrice,并且它将字符串作为参数。现在看看肥皂体的反应,例如:
<soap:Body xmlns:m="http://www.bookshop.com/prices">
<m:GetBookPriceResponse>
<return xsi:type="xs:decimal">5.99</return>
</m:GetBookPriceResponse>
</soap:Body>
这告诉我们操作的返回类型是十进制:
public decimal GetBookPrice(string bookName);
现在,您可以在vanilla WCF服务中重新创建服务操作。
服务定义可能包含复杂类型而不是基元,在这种情况下,您需要从请求/响应xml中推断出类型。如果类型太大,您可以尝试通过以下方式自动推断它们:
总之,这不是我羡慕的任务 - 即使您设法忠实地重建服务和类型定义,您仍然可能发现现有客户端无法基于错过一些不存在的可选数据来调用服务在您的请求/响应文件中。
答案 1 :(得分:1)
如果使用Visual Studio在空白项目中为服务创建客户端(参考&gt;“添加服务引用”),您将获得需要实现的界面(以及所有参数的POCO)。 然后创建一个新的WCF项目,并使用该接口和那些类作为您的合同。
这样您就可以尊重现有架构,而无需手动解释它。
答案 2 :(得分:1)
在服务文件夹中查找WcfServiceDescription.xml文件,它位于服务物理文件夹的\ App_Data \ Temp文件夹下(您可以检查其指向的IIS虚拟目录以查找物理路径)。
使用此文件再次发布服务。根据其中的定义,确保在再次发布服务之前将所需的程序集部署到GAC(例如架构或业务流程程序集)。
然后您可以使用BtsWcfServicePublishing.exe工具,您可以从命令提示符下载http://www.microsoft.com/en-us/download/details.aspx?id=21973。在此exe上传递WcfServiceDescription.xml文件及其完整路径
答案 3 :(得分:0)
最后,我使用了一个ashx处理程序来处理请求(与其他响应一起使用非常有帮助)xml-&gt;生成xsd - &gt;解析和读取请求。唯一的问题是.ashx终止。