使用C#发送MIME消息

在现代软件开发中,不同应用程序之间的数据交换是一个常见需求。特别是对于保险行业,ACORD标准()提供了一套广泛接受的数据标准和实施指南。然而,当涉及到与使用旧版ACORD标准的合作伙伴进行集成时,可能会遇到一些技术挑战。本文将介绍如何使用C#发送符合ACORD标准的MIME消息,而不依赖任何第三方工具。

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是一个非营利组织,为全球保险业提供数据标准和实施指南。尽管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==

使用代码发送MIME消息

在深入代码之前,有多种方法可以从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;
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485