EDI报文可以通过任何协议发送给我们的贸易合作伙伴,例如:SMTP、FILE、FTP、HTTP以及其他的许多协议,在这里就不一一列举了。但是,EDI标准仅支持VAN和AS2。VAN可以确保报文是有效的、将报文路由到合适的收件人以及会有交易的记录,而AS2是一种技术,可以让贸易合作伙伴允许使用S/MIME over HTTP/HTTPS安全地相互传输报文。BizTalk的强大功能可以将各种便准纳入同一个解决方案当中,让贸易合作伙伴无论是要使用AS2还是VAN,都可以通过BizTalk在单一的平台上来构建EDI解决方案。
在BizTalk中查看FTP和VAN与EDI的通信时,你会发现VAN提供的优秀功能,如报文验证、报文跟踪和报文传送等,如今也可以在BizTalk中找到了,在AS2解决方案中,BizTalk是一种“增值网络”。
AS2允许贸易合作伙伴直接通过安全的HTTP相互交流,当EDI中使用了AS2时,就会在端口处设置AS2标准的HTTP适配器来作为交互,或者是其他的相关适配器,不管采用那种方式,核心的概念都是相同的,实现安全的报文传输和对报文的验证。安全传输通过证书来进行处理,报文验证通过AS2、合作对象和BizTalk中的架构配置进行处理。
下图显示的是一个已经配置为允许通过标准的BizTalk HTTP适配器进行AS2传输的合作对象,合作对象已经设定AS2属性,并将用作HTTP适配器的一个扩展,当报文通过HTTP送达时,BizTalk会先将报文的信息和AS2的设置对比较,然后再打开EDI报文,接着会路由该报文,就像通过其他任一方法传送一样,AS2只是提供一种安全的方式,来传输数据以及任何相关的信封信息。
透过防火墙传送报文
在这里需要说明一个重要的概念,即如何将报文传送到位于防火墙后面的BizTalk Server服务器,也就是说BizTalk无法在网络上公开存取。当SOAP或HTTP接受端口添加到BizTalk时,该端口就会在本机IIS上工作,并且所有已发布数据都需要发送到该本机web服务器,例如,在使用BizTalk Web service 发布向导时,只能在安装了BizTalk 的本机IIS上创建该web service。
在无法从网络外部存取此IIS服务器的环境中,必须建立某种解决方案来路由通信,有多种解决方案可以解决这个问题,例如将BizTalk服务器置于网络的公共部分,或创建一个反向代理来通过防火墙的路由要求,从而让BizTalk位于private network中。
透过防火墙的通信可以通过编写代码的方式实现,因为将BizTalk服务器放在网络中的公共存取部分通常都不可接受,此时安全性的风险太高了。
在公用网络的公用IIS服务器上开发web service时,可以采用多种方法,其中一种是创建网关web service,另一种是创建代理web service。网关web service服务的建立,需要使用自定义编码,还需要进行复杂的格式转换,以符合BizTalk的预期格式,网关会接受来自公共网络的请求,并将其对应到向防火墙后面的web service发出的请求。另一方面,代理 Web 服务的建立,需要修改使用 BizTalk Web Services 发布向导生成的内容,然后将其副本置于公共 Web 服务器上。从其简单性来看,修改代理 Web 服务似乎是最理想的选择。
public BTSRedirect.SyncTransResponse Operation_SyncTrans(
[System.Xml.Serialization.XmlElementAttribute(
Namespace="http://GuardianProStar.BizTalk.Schemas.SyncTrans.SyncTransRequest",
ElementName="SyncTransRequest")] BTSRedirect.SyncTransRequest part)
{
BTSRedirect.SyncTransRequest objSyncTransReq = part;
BTSRedirect.SyncTransResponse objSyncTransRes = new BTSRedirect.SyncTransResponse();
BTSRedirect.GuardianProStar_BizTalk_Orchestrations_SyncTrans_SyncTransactions_Port_SyncTrans
objWebServiceMethodCall = new
BTSRedirect.GuardianProStar_BizTalk_Orchestrations_SyncTrans_SyncTransactions_Port_SyncTrans();
// authentication/credentials
string strWSUser = System.Configuration.ConfigurationManager.AppSettings["WSUser"];
string strWSPassword = System.Configuration.ConfigurationManager.AppSettings["WSPassword"];
string strWSDomain = System.Configuration.ConfigurationManager.AppSettings["WSDomain"];
string strWSAuthenticationType =
System.Configuration.ConfigurationManager.AppSettings["WSAuthenticationType"];
objWebServiceMethodCall.Url =
System.Configuration.ConfigurationManager.AppSettings["RedirectURL"];
System.Net.CredentialCache cache = new System.Net.CredentialCache();
cache.Add(new System.Uri(objWebServiceMethodCall.Url), strWSAuthenticationType,
new System.Net.NetworkCredential(strWSUser, strWSPassword, strWSDomain));
objWebServiceMethodCall.Credentials = cache;
// set the response equal to the return value of the call to the web service
objSyncTransRes = objWebServiceMethodCall.Operation_SyncTrans(objSyncTransReq);
return objSyncTransRes;
}
<appSettings>
<add key="RedirectURL"
value="[redirection URL]"/>
<add key="WSUser" value = "UserName"/>
<add key="WSPassword" value = "Password"/>
<add key="WSDomain"
value = "DomainName [Not Always Applicable]"/>
<add key="WSAuthenticationType" value = "basic"/>
</appSettings>