WCF XML 序列化消息格式
WCF XML serialization message format
我希望收到以下格式的输入消息:
<abc:message xmlns:abc="http://www.example.com" specver="0730">
<abc:myrequest msgid="0123">
<abc:AttID>3</abc:AttID>
<abc:AuthNb>100</abc:AuthNb>
我为此编写了以下代码:
接口:
[ServiceContract(Namespace = "http://www.example.com")]
[XmlSerializerFormat]
public interface IService1
{
[OperationContract(Name = "message")]
string RequestData(MyMessageRequest message);
数据合同:
[XmlRoot(Namespace = "http://www.example.com")]
public class MyMessageRequest
{
[XmlAttribute(Namespace = "http://www.example.com", AttributeName = "specver")]
public string Version { get; set; }
[XmlElement(ElementName = "myrequest")]
public MyRequest MyRequest { get; set; }
}
[XmlRoot(Namespace = "http://www.example.com")]
public class MyRequest
{
[XmlAttribute(AttributeName = "msgid")]
public string MsgId { get; set; }
[XmlElement(ElementName = "AttID")]
public string AttributionID { get; set; }
[XmlElement(ElementName = "AuthNb")]
public int AuthenticationNumber { get; set; }
当我将 WSDL 导入 SoapUI 时,我收到以下预定义请求:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:eft="http://www.eftpos2000.ch" xmlns:exam="http://www.example.com">
<soapenv:Header/>
<soapenv:Body>
<eft:message>
<!--Optional:-->
<eft:message specver="?">
<!--Optional:-->
<exam:myrequest msgnum="?">
<!--Optional:-->
<exam:AcqID>?</exam:AcqID>
<exam:AmtAuth>?</exam:AmtAuth>
您会注意到,我有两次名为“message”的元素。
关于如何删除 XML 根元素“消息”的任何想法?
BR
尼古拉斯
这是因为你方法中的变量名是myrequest,第一个 myrequest是方法的变量名:
我修改为message,下图是SoapUI中要求的请求格式:
这是 MyMessageRequest class:
[XmlRoot(Namespace = "http://www.example.com")]
public class MyMessageRequest
{
[XmlAttribute(Namespace = "http://www.example.com",AttributeName = "specver")]
public string Version { get; set; }
[XmlElement(ElementName = "myrequest")]
public MyRequest MyRequest { get; set; }
}
更新
第一个消息是operationcontract封装的节点。你可以删除它,但是它会生成一个默认方法名的节点,你不能删除它。
我希望收到以下格式的输入消息:
<abc:message xmlns:abc="http://www.example.com" specver="0730">
<abc:myrequest msgid="0123">
<abc:AttID>3</abc:AttID>
<abc:AuthNb>100</abc:AuthNb>
我为此编写了以下代码:
接口:
[ServiceContract(Namespace = "http://www.example.com")]
[XmlSerializerFormat]
public interface IService1
{
[OperationContract(Name = "message")]
string RequestData(MyMessageRequest message);
数据合同:
[XmlRoot(Namespace = "http://www.example.com")]
public class MyMessageRequest
{
[XmlAttribute(Namespace = "http://www.example.com", AttributeName = "specver")]
public string Version { get; set; }
[XmlElement(ElementName = "myrequest")]
public MyRequest MyRequest { get; set; }
}
[XmlRoot(Namespace = "http://www.example.com")]
public class MyRequest
{
[XmlAttribute(AttributeName = "msgid")]
public string MsgId { get; set; }
[XmlElement(ElementName = "AttID")]
public string AttributionID { get; set; }
[XmlElement(ElementName = "AuthNb")]
public int AuthenticationNumber { get; set; }
当我将 WSDL 导入 SoapUI 时,我收到以下预定义请求:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:eft="http://www.eftpos2000.ch" xmlns:exam="http://www.example.com">
<soapenv:Header/>
<soapenv:Body>
<eft:message>
<!--Optional:-->
<eft:message specver="?">
<!--Optional:-->
<exam:myrequest msgnum="?">
<!--Optional:-->
<exam:AcqID>?</exam:AcqID>
<exam:AmtAuth>?</exam:AmtAuth>
您会注意到,我有两次名为“message”的元素。
关于如何删除 XML 根元素“消息”的任何想法?
BR 尼古拉斯
这是因为你方法中的变量名是myrequest,第一个 myrequest是方法的变量名:
我修改为message,下图是SoapUI中要求的请求格式:
这是 MyMessageRequest class:
[XmlRoot(Namespace = "http://www.example.com")]
public class MyMessageRequest
{
[XmlAttribute(Namespace = "http://www.example.com",AttributeName = "specver")]
public string Version { get; set; }
[XmlElement(ElementName = "myrequest")]
public MyRequest MyRequest { get; set; }
}
更新
第一个消息是operationcontract封装的节点。你可以删除它,但是它会生成一个默认方法名的节点,你不能删除它。