【问题标题】:Wcf Service to consume SOAP, plus Raw Xml and Json in .NET 4.5.1使用 SOAP 的 Wcf 服务,以及 .NET 4.5.1 中的 Raw Xml 和 Json
【发布时间】:2014-02-13 17:39:11
【问题描述】:

我有一个 Wcf 服务 .NET 4.5.1,我可以使用 WcfTestClient.exe 连接到它并发送一个测试对象,或者使用以下的(soap)Xml;

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Header>
    <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://tempuri.org/IService/PostData</Action>
  </s:Header>
  <s:Body>
    <PostData xmlns="http://tempuri.org/">
      <person xmlns:d4p1="PersonNameSpace" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
        <d4p1:Id>1</d4p1:Id>
        <d4p1:Name>My Name</d4p1:Name>
      </person>
    </PostData>
  </s:Body>
</s:Envelope>

我的界面如下;

[ServiceContract]
public interface IService
{
    [OperationContract]
    [WebInvoke(Method = "POST",
        UriTemplate = "PostData",
        RequestFormat = WebMessageFormat.Xml,
        BodyStyle = WebMessageBodyStyle.Bare)]
    string PostData(Person person);
}

[DataContract(Namespace = "PersonNameSpace")]
public class Person
{
    [DataMember]
    public int Id { get; set; }

    [DataMember]
    public string Name { get; set; }
}

我的方法如下;

public string PostData(Person person)
{
    //do something with the object
    return "Well done";
}

这很好用。但是现在,我想通过从经典 ASP 页面传递原始 Xml 或 Json 作为示例来调用相同的方法 PostData;

<PostData>
    <person>
      <Id>1</Id>        
      <Name>My name</Name>
    </person>
</PostData>

或Json格式为

{
  "PostData": {
    "person": {
      "Id": "1",
      "Name": "My name"
    }
  }
}

如何将这些数据作为 Xml 或 Json 使用,以便我可以使用 XmlSerializer 或类似的东西;

JavaScriptSerializer.Deserialize(PostDataString);

基本上我想要做的是,无论请求是来自使用 SOAP 的应用程序,还是来自使用基本 Xml 帖子的网站,都获取这些数据并将其反序列化到我的对象中。

【问题讨论】:

    标签: c# xml json wcf soap


    【解决方案1】:

    我建议您可以打开两个端点,一个用于 xml,另一个用于 json。这是为了在使用 REST 时进行更好的练习,也可以让您的客户更好地使用。

    [OperationContract]
    [WebInvoke(Method = "POST", 
        ResponseFormat = WebMessageFormat.Xml, 
        BodyStyle = WebMessageBodyStyle.WrappedRequest, 
        UriTemplate = "/PostDataXML")]
    string PostDataXML(Person person);
    
    [OperationContract]
    [WebInvoke(Method = "POST",
        ResponseFormat = WebMessageFormat.Json,
        BodyStyle = WebMessageBodyStyle.WrappedRequest,
        UriTemplate = "/PostDataJSON")]
    string PostDataJSON(Person person);
    

    然后你只需要将这个对象发布到你的服务中:

    {
      "person": {
        "Id": "1",
        "Name": "My name"
      }
    }
    

    【讨论】:

    • 这是我唯一的选择吗,因为我将有 10 种方法,总共加倍为 20 种方法
    • 您仍然可以将两个 webinvoke 分配给同一个操作合约。这两个端点只是练习的东西,你可以找到更适合你的模型的东西。
    • 我尝试了您的建议,但收到“System.Net.WebException:远程服务器返回错误:(404)未找到。”
    • 你调用的 URL 是什么?您需要在路径中的 svc 文件之后附加 /PostData,如下所示:localhost/yourservice.svc/PostData
    • 我正在尝试使用 oClient.UploadString("myurl", "POST", "MyXml"); 从 C# 控制台应用程序发布到正确的 Url;我注意到它 MyXml 是空的,服务接受请求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    • 2011-08-25
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多