补充 BizTalk WCF 服务

Supplant a BizTalk WCF service

我有一个基于 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" %>

我的问题来了,有没有人知道如何根据请求或响应生成服务以取代服务。

如果您只有请求和响应 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> 

这告诉我们运算的 return 类型是十进制:

public decimal GetBookPrice(string bookName);

现在您可以在普通 WCF 服务中重新创建服务操作。

服务定义可能包含复杂类型而不是原始类型,在这种情况下,您需要从 request/response xml 推断类型。如果类型太大,您可以尝试通过以下方式自动推断它们:

  1. 从 XML 推断 XSD - 您只需要从 request/response 文件中提取请求和响应类型,然后 运行 通过 [=13] =],它将尝试为您的 request/response 类型生成 XSD 模式。
  2. 从 XSD 推断 CS - 获得 XSD 文件后,再次使用 xsd.exe 推断这些文件的 类。然后,您可以使用 DataContract 和 DataMember 属性注释这些 类,然后您可以在服务定义中使用它们。

总之,这不是我羡慕你的任务 - 即使你设法忠实地重构服务和类型定义,你可能仍然会发现现有客户端无法调用服务,因为错过了一些可选数据不存在于您拥有的 request/response 文件中。

如果您使用 Visual Studio(参考 > "Add Service Reference")为空白项目中的服务创建客户端,您将获得需要实现的接口(以及所有参数)。 然后创建一个新的 WCF 项目并使用该接口和那些 类 作为您的合同。

这样您将尊重现有架构,而无需手动解释它。

在您的服务文件夹中查找 WcfServiceDescription.xml 文件,它在您的服务物理文件夹的 \App_Data\Temp 文件夹下(您可以检查 IIS 虚拟目录,它指向的物理路径)。

使用此文件再次发布服务。根据其中的定义,确保在再次发布服务之前将所需的程序集部署到 GAC(例如架构或编排程序集)。

然后您可以使用 BtsWcfServicePublishing.exe 工具,您可以通过命令提示符从 http://www.microsoft.com/en-us/download/details.aspx?id=21973 下载该工具。在此 exe 上传递 WcfServiceDescription.xml 文件及其完整路径

最后,我使用了 ashx 处理程序来处理请求(结合其他响应非常有帮助)xml-> 生成 xsd -> 解析和读取请求。唯一的问题是 .ashx 终止。