使用DataContracts在WCF和ASMX之间传递对象时出现问题

时间:2011-03-17 06:47:14

标签: c# wcf datacontractserializer datacontract

我正在尝试使用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'。遇到'Element',名称为'Inventory',命名空间'http:// www .site.com /服务/'.

我可能会以完全错误的方式解决这个问题,所以对更好的方法(带样本)的建议会非常感激。我的最终目标是在WCF和WCF之间传递对象。使用自定义对象和DataContracts的WCF或ASMX服务。

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

以下是我发现这项工作的最终解决方案,但工作量最少。

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

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

  3. 我的通用解决方案是在Codeplex上使用此代码/文章,其中包含使用Reg Ex进行清理的扩展方法。非常简单。

  4. 这是我的结果代码:

    [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”,我将使用该对象。