【问题标题】:Problem passing object between WCF and ASMX using DataContracts使用 DataContracts 在 WCF 和 ASMX 之间传递对象的问题
【发布时间】:2011-03-17 06:47:14
【问题描述】:

我正在尝试使用 ASMX/WCF 在站点(公共/私有)之间传递对象。我可以从我的私有 ASMX 服务获取序列化对象到我的公共 WCF 服务,但我无法反序列化该对象。下面的代码后跟错误。

调用私有 ASMX 服务的 WCF 服务。

[WebGet(UriTemplate = "{part}")]
public Distributor GetDistributorInventory(string part)
{
    const string url = "http://www.site.com/service/lookup.asmx/StockCheck?part=" + part;
    //This is a wrapper for a HttpWebRequest that returns a string
    string results = WebHelper.HttpRequest("GET", "text/xml", null, url, new CookieContainer());  
    byte[] byteArray = Encoding.ASCII.GetBytes(results);
    MemoryStream stream = new MemoryStream(byteArray);
    DataContractSerializer deserialize = new DataContractSerializer(typeof(Distributor));
    return (Distributor)deserialize.ReadObject(stream);
}

用于公共/私人服务的合同

[DataContract(Namespace = "http://www.site.com/Services/", Name = "Inventory")]
public class Inventory
{
    [DataMember(Order = 1)]
    public string MPN{ get; set; }
    [DataMember(Order = 2)]
    public string DataSheetURL { get; set; }
    [DataMember(Order = 3)]
    public List<Distributor> Stock { get; set; }
}

[DataContract(Namespace = "http://www.site.com/Services/", Name = "Distributor")]
public class Distributor
{
    [DataMember(Order = 1)]
    public string Name { get; set; }
    [DataMember(Order = 2)]
    public string Part { get; set; }
    [DataMember(Order = 3)]
    public int Quantity { get; set; }
    [DataMember(Order = 4)]
    public string URL { get; set; }
}

错误信息:

第 1 行位置 166 中的错误。需要来自命名空间“http://www.site.com/Services/”的元素“Distributor”。遇到名称为“Inventory”、命名空间“http://www”的“元素” .site.com/Services/'。

我可能会以完全错误的方式来解决这个问题,因此对于更好的方法(带示例)的建议将不胜感激。我的最终目标是使用自定义对象和 DataContracts 在 WCF 和 WCF 或 ASMX 服务之间传递对象。

【问题讨论】:

    标签: c# wcf datacontractserializer datacontract


    【解决方案1】:

    看起来它正试图反序列化为Distributor,但来自StockCheck 调用的响应返回Inventory

    【讨论】:

    • 好电话,这并没有解决问题,但这是一个问题。很好的发现,谢谢!
    【解决方案2】:

    asmx 服务可能没有使用 DataContractSerialiser。 Here is short video 关于如何在 ASMX 服务中进行自定义序列化。

    或者您可以在 WCF 服务中使用 asmx 服务正在使用的相同序列化程序反序列化(XmlSerialiser?)

    另一种选择是使用 Json 序列化程序。有一个example here

    【讨论】:

      【解决方案3】:

      这是我为完成这项工作找到的最终解决方案,并且工作量尽可能少。

      1. 我从将对象作为 XML 传递到 JSON(这是我的最终目标,但我从 XML 开始)

      2. 收到我的 JSON 对象后,我注意到它有一个包装器“d:”,并且有一个正在添加的属性“__type:”。知道这些需要删除,我决定找到一种通用的方法来删除这些元素。

      3. 我的通用解决方案是使用 Codeplex 上的此代码/文章,该代码/文章具有使用 Reg Ex 进行清理的扩展方法。很简单。

      这是我的结果代码:

      [WebGet(UriTemplate = "{part}")]
      public Distributor GetDistributorInventory(string part)
      {
        const string url = "http://www.site.com/service/lookup.asmx/StockCheck";
        string results = WebHelper.HttpRequest("POST", "application/json; charset=utf-8", "{part: " + part + "}", url, new CookieContainer());
      
        Inventory inventory = new JavaScriptSerializer().CleanAndDeserialize<Inventory>(results);
      
        return inventory;
      }
      

      此解决方案的另一个好处是能够转换对象而不考虑名称空间。这导致能够在我的源 ASMX 服务中使用对象“sender.Inventory”,在我将使用该对象的 WCF 服务中使用对象“receiver.Inventory”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多