使用 BizTalk Web 服务重新发布内部 Web 服务

2024-04-25

我正在尝试使用 BizTalk 在两个 Web 服务之间进行通信。 它必须是这样的:

  • Service1获取输入并通过 BizTalk 发送消息Service2,
  • Service2响应该消息,将其转发至 BizTalk,并将其传递至Service1.
  • Finally Service1将响应返回给用户。

我花了几天的时间努力做到这一点,但我无法在没有编译器错误的情况下构建编排,而且我找不到带有输入输入的 Web 服务和 Web 端口的单个示例。我开始相信这是不可能的,至少对于 BizTalk 来说是这样。

最大的问题是:这可能吗?如果是,怎么办?


你的问题范围相当大,我想回答它可能不太适合SO“Q+A”格式。

然而,提供由一个或多个底层 Web 服务组成的复合企业服务似乎是一种常见的需求。

我构建了一个快速而肮脏的示例(BTS 2010 / VS 2010),并上传到 GitHubhere https://github.com/nonnb/BizTalkWCFSample(在右下角下载 zip 源代码)

这是从头开始实现这一点所采取的步骤的“食谱”,但我相信您需要获取要遵循的代码。

在 Visual Studio 中创建新的解决方案

添加 WCF 服务项目并发布到 IIS(本示例未涵盖范围)

  • 使用默认的VS2010 WCF项目,并调用该项目WCFService
  • Used basicHttpBinding为了简单起见,但显然可以使用其他绑定 (但需要额外的考虑,例如安全性等)
  • 请注意,NameSpace on ServiceContract, ServiceBehavior,并在网络配置中behaviour namespace已全部设置(否则这些将默认为tempuri)

将 4 个新的 BizTalk 项目添加到解决方案中:

我已经给他们打电话了BizTalkWCF.Orch, BizTalkWCF.Maps, BizTalkWCF.WCFPorts, and BizTalkWCF.Schemas

首先是 WCFPorts

  • 右键单击WCFPorts项目并选择“添加”,然后选择“生成的项目”
  • 选择使用WCF服务
  • 检查元数据交换 (Mex) 端点
  • 提供您的 WCF 服务的 URL(例如http://localhost:57582/Service.svc)
  • 保留命名空间 (BizTalkWCF.WcfPorts)
  • 完成向导 - WCF 工件现在应该存在
  • 如果您需要导入多个 Web 服务,我建议您为每个服务创建单独的 Visual Studio 解决方案文件夹

因为我们已经在 BizTalk 中拆分了项目(这通常是一个好主意),不幸的是向导会将所有导入的工件标记为内部工件,如果从其他程序集引用它们,则这不是很有帮助。 打开导入的生成的 Orchestration (MyService.odx)(注意,切勿删除或移动此 ODX,因为它包含生成的端口 - 只需将其与生成的 WCF 工件一起保留)。

在编排视图的底部,打开类型。在端口类型下,您应该看到 WCF 接口(IService)。单击它并将属性类型修饰符更改为“公共” 对多部分消息类型执行相同的操作(4 x IService_* - 请注意,服务上的每个 WCF 方法有 2 x 消息类型(一种用于请求,一种用于响应)。

现在应该构建 WCF Ports 项目。

接下来是 Schemas 项目添加 2 x 模式,代表将从 BizTalk 公开(发布)的内容(我将它们称为BizTalkServiceRequest and BizTalkServiceResponse) 此示例只是在底层 WCF 服务上提供了一个简单的外观,因此我在请求和响应上获得了与原始 WCF 服务类似的字段,具有相同的 xs 类型。但请注意,底层 WCF 服务上的“实体”概念已被请求和响应消息所取代。然而,可以跨多个消息重构和重用架构 (xsd:import) 中的公共元素。 我刚刚使用了默认命名空间和“根”节点,但请注意,这些对 BizTalk 服务使用者是可见的,因此在实际项目中,您需要更多地考虑这一点。

请注意,我们没有重用导入/生成的 WCF 服务架构。在综合性企业中,还可以使用第三组模式,即“规范”模式,它们与 BizTalk 服务的使用者和所消费的服务所使用的格式无关(并且还需要更多映射)。

接下来是地图,在传入请求到 WCF 输入架构之间,然后将响应从 WCF 输出架构返回到 BizTalk 服务使用者的另一个映射之间。 在地图项目上,添加对 WCFPorts 项目和 Schemas 项目的 .Net 引用。 将新地图添加到地图项目 对于源架构,找到引用架构 - BizTalkServiceRequest 架构。 对于“目标架构”,选择“WCF 端口架构”(名称被修改得很糟糕,但它将是带有 MyService 的架构 - 而不是数据契约或微软架构)。请注意,您随后需要选择需要使用的包含模式。选择GetDataUsingContract架构。在元素下,将鼠标从源名称元素拖动到目标架构值,然后从IsAddSuffix to the BoolValue元素。 对返回响应消息执行相同的操作 - 显然,这次 WcfResponse 消息是源,公开的 BizTalk 响应是目标。布尔值在响应中没有用,因此仅映射字符串值。 地图现在应该可以编译了。

最后是 Orchestration 项目

  • 添加对 Maps、Schemas 和 Ports 项目的引用
  • 添加一个新的 Orchestration(我称为 AddService Orchestration)。
  • 您需要添加接收端口(添加在左侧)和发送端口(添加在右侧)。
  • 发送端口使用现有导入的 WCF 端口(我们之前公开的)。我将发送请求并接收响应。
  • 端口绑定选择Direct Binding,并通过过滤表达式进行路由。
  • 对于接收端口,您需要创建一个新的端口类型 - 请求响应。接收请求,发送响应,然后再次直接绑定,通过过滤器表达式进行路由。
  • 同样,您需要将端口公开
  • 您需要在接收端口上设置请求和响应的消息类型(单击请求和响应,然后在架构程序集中找到消息类型)
  • 编排中的形状应该是不言自明且简单的 - 基本上只是绑定端口来接收和发送形状,然后在变换形状中使用映射。
  • 初始接收形状是激活。

构建+发布

现在一切都应该构建完成,因此是时候发布到 BizTalk (我假设有一个本地服务器) 现在,我们将使用向导发布编排,并使用 IIS 来呈现公开的 Web 服务,但请注意,Biztalk 也可以自行托管。 请记住在所有 4 个 Biztalk 项目的“部署”选项卡中设置应用程序名称(否则它们将出现在默认应用程序中)。另外,请记住,BizTalk 程序集需要签名,因此创建一个 .SNK(签名选项卡)

右键单击该解决方案,然后单击“部署”。 (注意,必须先构建+部署项目,然后才能使用发布向导公开服务) 假设部署成功,您需要配置编排(另一个 Orch 是由 WCF 导入生成的 - 它拥有 WCF 端口) 创建发送静态请求响应发送端口 -WCF basicHttpBinding,将其指向您的 WCF Web 服务 URL。 您可以从 WCF WSDL 获取 SOAP 操作,例如YourNameSpaceHere/IService/GetDataUsingDataContract将过滤器添加到消息的发送端口 (xmlns#root),例如,YourNameSpaceHere#GetDataUsingDataContract

回到 Visual Studio,您可以现在将 Orch 发布为 Web 服务(工具:BizTalk WCF 服务发布向导) 启用元数据发布。我再次使用 basicHttpBinding 。并创建接收端口,选择应用程序(BizTalkWCFSample)

出现提示时,选择包含业务流程的程序集 (BizTalkWCF.Orchs) 系统还会提示您设置 WCF 服务的目标命名空间 - 保留此记录,就好像您需要重新发布服务一样,您可能希望保持命名空间相同。

最后的位置就是它将在 IIS 中发布的位置。如果您不想为锁定公开的服务安全性而烦恼,请选择“允许匿名访问”。 AFAIK 无法控制自动创建的接收端口的名称。

您现在需要启动 BizTalk 应用程序 - 解决任何突出的配置问题(例如,将 orch 分配给进程)

您需要在 IIS 中建立一个新的 .Net 4 应用程序池(将其命名为BizTalkIsolatedHost),
然后将向导在 IIS 中创建的应用程序移至此应用程序池 您现在应该能够导航到您的 Orchestration“端点”,例如:http://localhost/BizTalkWCF.Orchs/BizTalkWCF_AddSuffixService_RcvSuffixService.svc

总结一下——这一切都值得吗?

从上面可以看出,在 BizTalk 中重新公开 Web 服务需要大量工作,而且除了可能拥有一些 BizTalk 跟踪和重试功能之外,我们还没有真正在 BizTalk 中添加任何价值:) 。在编排组合服务时(一个传入请求需要多个后端服务调用才能完成,并且如果还使用规范模式),将需要考虑更多的模式和映射,以及编排的额外复杂性。 当使用 Web 服务时,您会获得大量工件(模式、地图、 消息、端口等)非常快,因此严格的命名约定至关重要。

我们还没有考虑异常处理、重试等问题。

因此,在计划以这种方式发布 100 个服务之前,只需进行一次健全性检查,我想我们需要考虑其他技术替代方案:

  • BizTalk ESB 工具包(特别是如果您的企业中有一定程度的通用性,和/或您可以控制服务使用者)
  • 其他 ESB(Mass Transit、NServiceBus、ServiceMix 等,或基于 Camel、Mule、Drools、Rabbit、Windows 服务总线等构建的 DIY 总线),可能具有用于公开 Web 服务“端点”的自定义外观
  • 对于批量“服务外观”,微软开始制作一项有前途的技术原型,称为托管服务引擎 http://msdn.microsoft.com/en-us/magazine/dd727511.aspx但不幸的是,这似乎被搁置了。

但是,如果只有少数这样的高价值服务,特别是如果此类服务需要组合和映射多个内部服务,或者使用不同的消费技术(SAP RFC、SQL、SOAP 等),那么 BizTalk 就适合这项工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 BizTalk Web 服务重新发布内部 Web 服务 的相关文章

  • 在 REST WCF 中读取 HttpRequest 正文

    我在 net 4 中运行了一个 REST WCF 服务 并且我已经测试了它正在工作并接受我对其发出的 HttpRequest 的 Web 服务 但我在尝试访问 Web 服务中的 HttpRequest 主体时遇到了问题 我尝试使用 Fidd
  • 将耗时的进程从我的 ASP.NET 应用程序中移走

    我的 Asp net 应用程序生成动态 pdf 有时这需要一段时间 并且是一个相当繁重的过程 实际上我不希望我的用户等待pdf 只需在生成后将其发送到那里的邮件即可 所以我尝试了网络服务 我将一个 id 从数据库获取数据 和一些字符串传递给
  • 如何为 HTTP GET 的多个 Key-Value 参数设计 REST URI

    我正在设计一个 RESTful API 一项服务应该提供多个键值对的查询功能 例如 客户端可以使用一个 HTTP GET 请求来查询不同的产品及其关联的数量 客户想要查询金额为 44 的产品 1 和金额为 55 的产品 2 我实际上不希望我
  • 多次发生 Web 服务错误

    在许多机器 使用 Asp net 1 和 2 上 我们看到以下带有随机文件名的错误 使用 dll每次我们尝试进行 Web 服务调用时都会生成此扩展名 过去我们不得不重新安装asp net这似乎已经解决了问题 然而 有一次我们尝试获取命令提示
  • REST Web 服务 - 动态查询参数

    我需要将动态查询参数发送到 REST Web 服务 GET 方法 如下所示 主机 端口 应用程序 field1 XXX value1 VVV field2 XXX value2 XXX 消费者可以发送参数最多为字段和值 每个字段都映射到值
  • Java 中的序列化日期

    我通过 Web 服务传递一些对象 其中一些包含 java sql Date 因为 Date 没有空的构造函数 所以它不想被序列化 问题的第一部分很简单 在客户和服务之间传递日期的最佳方式是什么 第二部分有点棘手 一旦我决定如何传递日期 我显
  • 如何在收到一定数量的数据后调用 Web 服务并将其加载到表视图中

    我正在开发一个项目 在该项目中 首先调用 Web 服务 我们会获取大约 20 个数据 我们将这些数据加载到表视图中 一旦我们开始向上滚动查看视图 当它达到 20 个数时 我们需要为接下来的 20 个数调用服务 就像 Facebook 所做的
  • CXFServlet 抛出 java.lang.NoSuchMethodError:

    java lang NoSuchMethodError org codehaus stax2 ri EmptyIterator getInstance Lorg codehaus stax2 ri EmptyIterator at com
  • 为什么设置 POST Content-type:"Application/Json" 会导致 REST WebService 上出现“错误请求”?

    我在使用网络服务时遇到一个奇怪的问题 当我作为客户端将表单发布到 REST Web 服务而不设置任何 类型内容 标头时 一切正常 我接到服务器上的电话并且 Json 文本可用 如果我作为客户端将我的发布请求的内容类型标头设置为 applic
  • 当与不需要虚拟机的编译程序一起使用时,CGI 是否仍然很慢?

    当我学习 CGI 时 我了解到任何编程语言都可以用来将其输出挂钩到 http 响应消息 而它的输入是 http 请求消息 我读过的很多文章都在 Perl 的背景下讨论 CGI 这是因为 Perl 是与 CGI 结合使用的最常见的语言吗 我想
  • Web 服务代码不返回字符串数组

    我想从我的 Web 服务方法返回 abc xyz ghi tru 其中 是分隔符 形式的字符串数组 但是我做不到 这是我当前的网络服务代码 using System using System Collections using System
  • Restful服务参数不匹配异常

    我有服务 POST Path post Consumes application json public Response createProductInJSON Product product String result Product
  • 什么是 Service Worker 控制台? & 它在 Chrome 浏览器中的什么位置?

    我正在研究推送通知并遇到一个陌生的术语 service worker console 我已阅读并使用过该术语console log or web console在浏览器中 但我不熟悉这个术语service worker console 之后
  • 如何使用 Visual Studio 2010 创建 Web 服务负载测试?

    有没有办法像测试网站一样使用 VS2010 测试 Web 服务 对于网站 我可以创建一组 WebTestRequest 对象来模拟测试中网页的加载和解析 然后 实现 GetRequestEnumerator 我可以为负载测试生成结果 以便任
  • 将 SAML 令牌与 Web 服务 (wsdl) 结合使用

    我已从提供商处获得了 wsdl 文件和 pfx 我致电 IdP 并获取 SAML 令牌 现在我需要将该令牌传递给 WebService 如何使用 SAML 令牌来处理 WebService 我正在使用 NET 4 5 在以下两篇文章的帮助下
  • ASP.NET:WebService 类实例化的频率是多少?如何在其中制作一个持久对象?

    一个简单的问题 但我在谷歌上找不到答案 Web 服务类实例化的频率是多少 是每次调用 Web 服务一次 还是每次 任意时间段 一次 还是每次其他事情一次 EDIT 我本来希望这个班级能长久地生活下去 但事实似乎并非如此 关键是 我有一个用于
  • 如何添加重试以调用 Web 服务?

    我有一个应用程序调用使用 wsHttpBinding 的 Web 服务 我需要在连接超时等情况下对 Web 服务调用实现某种重试功能 执行此操作的最佳方法是什么 我已经阅读过有关 WS ReliableMessaging 的内容 但这不是
  • 使用VS2019创建WebService

    我想使用 Visual Studio 2019 使用 C 在现有 NET 项目中创建 WebService 在互联网上搜索 我能找到的只是旧 VS 版本的教程 如何创建它 使用 Visual Studio 2019 接收 POST 数据的最
  • JAX-WS:有状态 WS 在独立进程中失败

    我在 Tomcat 上部署了一个有状态的 Web 服务 它由工厂服务和主要 API 服务组成 并且工作得很好 工厂服务将 W3CEndpointReference 返回到主 API 实例 客户端使用会话 现在 我尝试将相同的服务作为独立应用
  • 在 WSDL 中包含 XSD

    我正在编写一个 wsdl 文件来在未来 SoapUI 中部署模拟服务 但我在包含我的 xsd 文件时遇到问题 XSD File

随机推荐

  • 将自定义文件夹添加到 bazel java 测试中的类路径

    我正在尝试将大型代码库从 Maven 迁移到 bazel 我发现一些测试写入target classes and target test classes并且生产代码将其读取为类路径上的资源 这是因为 maven Surefire fails
  • E2E:使用 Wix Detox 从 UIImagePickerController 选择图像

    Description 我需要编写一个 e2e 测试 在某些时候它必须在 UIImagePickerController 中选择一个图像 我尝试使用element by type UIImagePickerController tapAtP
  • 如何使用python opencv2减去两个图像以获得前景对象

    有没有办法在 python opencv2 中减去两个图像 图片 1 任何图像 例如房屋图像 静态图像 图 2 带有物体的同一图像 在房子里 一个人站着 静态图像 动态物体 图片 3 图片 2 图片 1 如果我们减去Image2 from
  • Azure 中的 EUAP 区域是什么?

    Azure 中的某些区域被称为 EUAP 区域 但是我无法找到任何关于这意味着什么的定义 EUAP 代表什么 https learn microsoft com en us dotnet api microsoft azure docume
  • 如何使用 Objective-C 用空格分隔字符串?

    假设我有一个像这样的字符串 hello world this may have lots of sp ace or little space 我想将此字符串与此分开 hello world this may have lots of sp
  • MySQL 更新时会覆盖相同值的列吗?

    在MySQL中更新表时 例如 Table user user id user name 1 John 2 Joseph 3 Juan 如果我运行查询 UPDATE user SET user name John WHERE user id
  • 单击之前搜索查看查询提示

    我有一个搜索视图和一个查询提示属性 但是 只有在单击搜索视图后才会出现提示 有没有办法让它在点击之前出现
  • SonarQube 6.7 登录时冻结

    我刚刚在带有 MySQL 5 7 的 Ubuntu 16 04 服务器上安装了 SonarQube 6 7 我的同事使用 SonarQube 他们从托管在 GitHub 存储库上的源代码添加了他们的项目 添加了 3 4 个项目后 我们在 M
  • 使用mongoose在mongodb模式中使用ensureIndex

    我想打电话ensureIndex on the authorName 命令是什么以及我应该将其放在这段代码中的什么位置 var mongoose require mongoose defines the database schema fo
  • seo - 图像和 h1

    我遇到一种情况 我想坚持使用我的徽标而不是 h1 标签的实际文本 如果我将关键字放在 alt 标签中 而不是实际编写 我会在 SEO 上受到影响吗 文本和图像同时存在更好吗 想法 div h1 a href img src logo jpg
  • Spark 编码器:何时使用 beans()

    我在使用Spark的缓存机制时遇到了内存管理问题 我目前正在使用Encoder我正在使用 Kryo 想知道切换到 beans 是否可以帮助我减少缓存数据集的大小 基本上 在使用时使用 beans 相对于 Kryo 序列化有哪些优点和缺点En
  • 已将数据预先填充到资产中的领域?

    通常我使用 Realm 作为 RealmConfiguration config new RealmConfiguration Builder applicationContext deleteRealmIfMigrationNeeded
  • 匹配嵌套的html注释块正则表达式[重复]

    这个问题在这里已经有答案了 我有这个 html 代码块 some html content here top base some html content here 1 top some html content here 2 top so
  • Magento Connect 登录后尝试更改为什么路径?

    我每次都会收到错误消息 部署 FTP 错误 登录后无法 chdir 我通过 chmod ing 我的 complete path to magento installation dir 成功完成了第一次连接和设置下载器 至 0777 在 d
  • Apache Tomcat 服务器不在添加新服务器的列表中

    我需要添加 Apache Tomcat 服务器 但 Apache 文件夹中只有 Geronimo 服务器 如何解决这个问题 STS 4 0 0 0 M12 STS4 发行版不包含这些开箱即用的适配器 因为我们出于各种原因 减少启动时间 减小
  • Angular 2 - 使用共享服务

    看起来共享服务是解决许多情况的最佳实践 例如组件之间的通信或替换旧的 Angular 1 的 rootscope 概念 我正在尝试创建我的服务 但它不起作用 有什么帮助吗 泰 应用程序组件 ts import Component from
  • 哪里可以下载 Microsoft.Phone.WinJS.2.1?

    我正在尝试使用 WinJS 制作通用 Windows 应用程序 我已经下载了VS2013的最新更新 RC 版本 我已经安装了我能找到的所有 SDK 我还安装了 WinLibJS VSE exe 扩展 有趣的是 VS 更新一直说我没有 当我打
  • 打印时字体颜色发生变化

    我这里有一个非常令人困惑的问题 我有一个动态构建的表 这里可能是一个不重要的事实 但只是让你知道 在网页上 我根据逻辑标准将文本设置为特定颜色 在页面上 看起来很棒 当进行打印预览 和实际打印 时 颜色有很大不同 在我的代码中 颜色是 红色
  • Laravel 通过表名获取模型

    有没有办法通过表名获取模型 例如 我有一个 用户 模型 其表定义为protected table users 现在 我想做的是通过等于 users 的表名获取模型 这个函数更像是相反的Model getTable 我到处搜索但找不到解决方案
  • 使用 BizTalk Web 服务重新发布内部 Web 服务

    我正在尝试使用 BizTalk 在两个 Web 服务之间进行通信 它必须是这样的 Service1获取输入并通过 BizTalk 发送消息Service2 Service2响应该消息 将其转发至 BizTalk 并将其传递至Service1