cod*_*zen 4 wcf datacontract datacontractserializer messagecontract
我有以下类型,可以在WCF中用作消息合同:
[MessageContract(IsWrapped = true,
WrapperNamespace = "http://example.com/services",
WrapperName = "EchoRequest")]
public class EchoRequest
{
public EchoRequest() { }
public EchoRequest(String value)
{
Value = value;
}
[MessageBodyMember(Name = "Value",
Namespace = "http://example.com/services",
Order = 0)]
public String Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
当我使用svcutil.exe生成此类型的代理时,我将获得一个客户端,该客户端能够与托管它的服务进行通信,并且元素上的XML名称空间根据Message Contract属性正确。
当我Message.CreateMessage(...)在其实例上使用时,名称空间将还原为默认名称(http://schemas.datacontract.org/2004/07 / ...)。当我使用的实例时DataContractSerializer,也会发生同样的事情。我尝试将名称空间传递给DataContractSerializer构造函数,并且只有包装器包含在名称空间中:
var requestMessage = new EchoRequest("hello, world!");
var serializer = new DataContractSerializer(typeof(EchoRequest),
"EchoRequest",
"http://example.com/services");
var stream = new MemoryStream();
serializer.WriteObject(stream, requestMessage);
var data = Encoding.UTF8.GetString(stream.ToArray());
Run Code Online (Sandbox Code Playgroud)
此时,“数据”为:
<EchoRequest xmlns="http://example.com/services"
xmlns:a="http://schemas.datacontract.org/2004/07/TestClient"
xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<a:Value>hello, world!</a:Value>
</EchoRequest>
Run Code Online (Sandbox Code Playgroud)
为什么DataContractSerializer出现似乎忽略MessageContract属性?svcutil如何工作?
这是因为消息合同不是数据合同,所以数据合同使用不同的属性来标记其类。尝试使用类型化的消息转换器;
EchoRequest echoRequest = new EchoRequest{ value = "Hello" };
TypedMessageConverter echoMessageConverter = TypedMessageConverter.Create(
typeof(echoRequest),
"YourActionNameHere",
"http://example.com/services");
Message request = echoMessageConverter.ToMessage(
echoRequest,MessageVersion.Soap11);
Run Code Online (Sandbox Code Playgroud)
然后,您将准备好一条消息,可以根据需要拉出请求正文。
| 归档时间: |
|
| 查看次数: |
3567 次 |
| 最近记录: |