无法在 wcf c# 中接收 xml 发布请求值

Posted

技术标签:

【中文标题】无法在 wcf c# 中接收 xml 发布请求值【英文标题】:can't receive xml post request values in wcf c# 【发布时间】:2019-12-15 02:45:29 【问题描述】:

我正在试验 WCF 并使用 id 和 name 参数构建了一个标准产品类,我的目标是从休息中接收它,并返回状态。

[DataContract]
    public partial class Product 
        [DataMember]
        public int Id  get; set; 
        [DataMember]
        public string Name  get; set; 
    
    [DataContract]
    public class Message
    
        [DataMember]
        public bool isSucceed  get; set; 
    

用相对的 Post 方法来

[WebInvoke(UriTemplate = "ProductPingXML", Method = "POST", 
            RequestFormat = WebMessageFormat.Xml)]
        [Description("Recive Post Message")]
        public Message PingXmlProduct(Product Input)
        
            Message message = new Message();
            //Todo Capture what rest send 
            if (Input == null)
            
                message.isSucceed = false;
            
            else
            
                message.isSucceed = true;
            

            // strip the xml from the body

            // Assign the values to the new obj class Product
            return message;
        

我正在尝试通过邮递员使用 XML 帮助架构中的这个 XML 来调用它。

<Product xmlns="http://schemas.datacontract.org/2004/07/RestML.Data">
  <Id>2147483647</Id>
  <Name>String content</Name>
</Product>

使用 WCF 对我来说相对较新,所以我可能会在这里遗漏一些东西。所以我的问题是: 如何在 PingXmlProduct 中接收邮递员 XML 并将相应的值分配给新的 obj;

【问题讨论】:

此时(在PingXmlProduct 方法内),xml 已经被 WCF 框架“从正文中剥离”。您只需将Product 类的一个实例分配给Input 变量,并使用xml 中的值填充属性Id 和Name。 好的,如果我尝试使用 xml 请求发布,我会从邮递员那里得到“无法得到任何响应”?是不是因为响应是一个字符串而不是 xml 状态码是什么? 404?那将意味着“未找到”。我建议根据状态码采取后续步骤。 【参考方案1】:

我们应该使用 webhttpbinding 创建 Restful 风格的 WCF 服务。请参考以下配置。

<system.serviceModel>
    <services>
      <service name="Server1.MyService">
        <endpoint address="" binding="webHttpBinding" contract="Server1.IService" behaviorConfiguration="rest"></endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"></endpoint>
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:5577"/>
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="rest">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
  </system.serviceModel>

那么我们应该指定webmessagebodystyle。

[OperationContract]
        [WebInvoke(BodyStyle =WebMessageBodyStyle.Bare)]
        void GetData(Product product);

假设有以下定义。

[DataContract]
    public class Product
    
        [DataMember]
        public int ID  get; set; 
        [DataMember]
        public string Name  get; set; 


我们可以在 Postman 中像下面这样调用服务(请注意自定义类的命名空间)。 关于WebMessageBodyStyle属性请参考我之前的回复。Get the object is null using JSON in WCF Service 如果问题仍然存在,请随时告诉我。

【讨论】:

以上是关于无法在 wcf c# 中接收 xml 发布请求值的主要内容,如果未能解决你的问题,请参考以下文章

通过邮递员将帖子请求接收到 wcf

如何在 C# WCF 中接收 Stripe api webhook

在 C# 中为 WCF 服务反序列化简单的 XML 数组对象

C# WCF的通信模式

将 JSON 发送到 C# WCF 服务会导致:请求实体太大

SOAP(C# WCF) 通过 Zeep 接收整数列表作为参数