[我正在尝试了解如何创建/向后设计Multipart WCF Soap端点,该端点将附件作为输入参数,并以“ MIME-delimiter”分隔。
我有一个示例,说明谁向此类端点发出请求,但我不知道如何创建服务来接收请求。
所以我得到的示例是这样的(仅供参考,出于安全原因,我删除了信息):
--MIME11111.11111
<SOAP-ENV:Envelope xmlns:SOAP-ENV="" xmlns:eb="" xmlns:xsi="" xsi:schemaLocation="">
<SOAP-ENV:Header>
<eb:MessageHeader SOAP-ENV:mustUnderstand="1" eb:version="2.0">
<eb:From>
<eb:PartyId eb:type="TYPE1">NUMBER</eb:PartyId>
</eb:From>
<eb:To>
<eb:PartyId eb:type="TYPE2">NUMBER</eb:PartyId>
</eb:To>
<eb:CPAId>ID</eb:CPAId>
<eb:Service eb:type="TYPE3">TEXT</eb:Service>
<eb:Action>TEXT</eb:Action>
<eb:MessageData>
<eb:MessageId>ID</eb:MessageId>
<eb:Timestamp>DATE</eb:Timestamp>
</eb:MessageData>
</eb:MessageHeader>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<eb:Manifest eb:version="2.0">
<eb:Reference xlink:href="cid:payload-1" xlink:role="aop:ROOT"/>
</eb:Manifest>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
--MIME11111.11111
Content-ID: payload-1
<?xml version="1.0" encoding="UTF-8"?>
<aop:ROOT xsi:schemaLocation="" xmlns:aop="" xmlns:xsi="">
<aop:ELEMENT>
<aop:SUBELEMENT11>TEXT</aop:SUBELEMENT11>
<aop:SUBELEMENT12>
<aop:SUBELEMENT21>NUMBER</aop:SUBELEMENT21>
<aop:SUBELEMENT22>NUMBER</aop:SUBELEMENT22>
</aop:SUBELEMENT12>
</aop:ELEMENT>
</aop:ROOT>
--MIME11111.11111--
到目前为止我所做的是:
创建了这样的界面:
[ServiceContract]
public interface IService1
{
[OperationContract]
[WebInvoke(Method = "Post", BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "/PostBusinessData")]
PostBusinessDataResponseContract PostBusinessData(Manifest data);
}
[MessageContract]
public class Manifest
{
[MessageHeader]
public Headers MessageHeader { get; set; }
[MessageBodyMember]
public Stream Reference { get; set; }
}
[MessageContract]
public class PostBusinessDataResponseContract
{
[MessageBodyMember]
public string PostBusinessDataResponse { get; set; }
}
创建了这样的控制器/服务:
public class Service1 : IService1
{
public PostBusinessDataResponseContract PostBusinessData(Manifest data)
{
return new PostBusinessDataResponseContract() { PostBusinessDataResponse = "It Works"};
}
}
我的Header类是通过在上面的示例中的“ header”元素之间“特殊粘贴” XML结构而创建的。
我为soap-envelope标头设置了Model类,除了元素上的某些属性相反,它们在生成的请求结构中显示为子元素。
但是最主要的是,我不太了解如何为附件建立in参数的代码。在我看来,多部分示例中的附件以流的形式出现,但是以什么形式流?文件,xml字符串/文本? SOAP信封中引用所包含的唯一内容是所谓的“ Content-ID”。没有文件名,仅此而已。
我如何在我的支持中设置端点以能够使用上面示例中显示的请求类型,这确实是我的问题。
根据您的描述,我进行了演示。创建WCF服务后,我们可以通过添加服务引用来生成代理类以调用该服务。
右键单击引用,然后选择添加服务引用。
在地址栏中输入服务的地址,然后单击确定以生成代理类和配置文件,以供您调用服务。
ServiceReference1.Service1Client service1Client = new Service1Client();
string str = "Testing";
byte[] array = Encoding.ASCII.GetBytes(str);
MemoryStream stream = new MemoryStream(array);
Console.WriteLine(service1Client.PostBusinessData(stream));
Console.ReadLine();
客户端可以通过生成的代理类支持服务器的请求类型。
这是结果。
UPDATE
WCF支持MTOM,它是W3C标准取代的SwA。这是指向MTOM相关信息的链接:
https://docs.microsoft.com/en-us/dotnet/framework/wcf/samples/mtom-encoding
有关MTOM和SWA的更多信息,请参考以下链接:
在WCF中,如果您想接收给出的XML消息,我认为您可以使用消息检查器来截获XML消息并进行解析。
public class ServerMessageLogger : IDispatchMessageInspector
{
public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
string xml = ""+request;
// Parse the received XML here
return null;
}
public void BeforeSendReply(ref Message reply, object correlationState)
{
string xml = ""+reply;
//Encapsulate the XML to send
}
}
有关消息检查器的更多信息,请参考以下链接:
https://docs.microsoft.com/en-us/dotnet/framework/wcf/samples/message-inspectors?redirectedfrom=MSDN