在现代软件开发中,不同应用程序之间的数据交换是一个常见需求。特别是对于保险行业,ACORD标准()提供了一套广泛接受的数据标准和实施指南。然而,当涉及到与使用旧版ACORD标准的合作伙伴进行集成时,可能会遇到一些技术挑战。本文将介绍如何使用C#发送符合ACORD标准的MIME消息,而不依赖任何第三方工具。
MIME(多用途互联网邮件扩展)是一种互联网标准,它允许在客户端和服务器之间交换不同类型的数据。MIME通过在头部指定数据类型,使得服务器能够选择合适的应用程序或程序来处理数据。例如,一个简单的MIME消息可能如下所示:
MIME-Version: 1.0
Content-Type: multipart/related; boundary=--=-glZ6jtnXmVAn68ZSF5H6Zw==
--=-glZ6jtnXmVAn68ZSF5H6Zw==
Content-Type: text/plain; charset=utf-8
Content-ID: 291169ef-d733-4989-a39f-2a5619d09c97
Request from Party A to Party B
--=-glZ6jtnXmVAn68ZSF5H6Zw==
Content-Type: text/xml
Content-ID: 8365146c-c9bc-47f5-8487-e6b34611d078
<ac:Attachments><ac:Attachment><ac:Document><ac:DocumentReference>TS43289061M1</ac:DocumentReference>
</ac:Document></ac:Attachment></ac:Attachments>
在这个示例中,可以看到MIME消息以头部开始,指定了MIME消息的版本。随后是Content-Type,MIME支持多种内容类型。上述示例中的消息类型为multipart/related,意味着消息被分割成多个部分,只有当所有部分组合在一起时,消息才有意义。
ACORD是一个非营利组织,为全球保险业提供数据标准和实施指南。尽管ACORD已经更新了其标准,开始使用MTOM等最新技术传输消息,但在与坚持使用旧版ACORD标准的合作伙伴集成时,不得不使用多部分MIME消息。
根据ACORD,一个带有附件的示例POST请求可能如下所示:
POST http://partner-test.com/api/request HTTP/1.1
MIME-Version: 1.0
Content-Type: Multipart/Related; boundary= MIME_boundary1234; type=text/xml; start=xxxxx
Host: partner-test.com
Content-Length: nnnn
SOAPAction: "PostRq"
ACORD消息的业务部分:
--MIME_boundaryB0R9532143182121
Content-ID:
Content-Length: nnn
Content-Type: application/octet-stream; charset="utf-8"
MIME Part # 2 Header
<Binary Content of the file>
MIME边界结束:
-- MIME_boundary1234==
在深入代码之前,有多种方法可以从C#获取SOAP请求(在Code Project和其他网站上有许多相关文章),因此需要创建的负载部分可以使用ACORD共享的模式来完成。现在,为了创建消息的其余部分,执行以下操作:
导入库:
using System.Net.Http;
设置属性,如需要发布请求的endpointURL和MIME边界,用于指定消息的不同部分。
static string _endPointURL = "http://avalidwebservice.com";
static string _boundary = "=-glZ6jtnXmVAn68ZSF5H6Zw==";
Uri _endpoint = new Uri(_endPointURL);
HttpRequestMessage _requestMessage = new HttpRequestMessage(HttpMethod.Post, _endpoint);
创建一个HTTP请求消息,并将HTTP方法标记为POST。创建一个MultipartContent对象,传递内容类型为"related",并指定设置的边界。接下来是创建一个httpContent,将捕获的SOAP消息/任何其他XML有效载荷传递给HttpContent的构造函数。
MultipartContent _multiPartcontent = new MultipartContent("Related", boundary);
HttpContent _xmlContent = new StringContent("") // 这里可以传递存储为字符串的xml
_xmlContent.Headers.ContentType = new MediaTypeHeaderValue("text/xml");
_xmlContent.Headers.Add("Content-ID", Guid.NewGuid().ToString());
// 添加任何其他内容头部
_xmlContent.Header.Add("key", "value");
_multiPartContent.Add(_xmlContent);
设置HttpRequestMessage的multiPartContent。创建一个HttpClient对象,调用send asyc方法发送请求消息。设置HttpCompletionOption.ResponseContentRead和CancellationToken.None。
_requestMessage.Content = _multiPartContent;
HttpClient httpClient = new HttpClient();
Task<HttpResponseMessage> httpRequest = httpClient.SendAsync(requestMessage, HttpCompletionOption.ResponseContentRead, CancellationToken.None);
HttpResponseMessage httpResponse = httpRequest.Result;