【问题标题】:C# WCF Passing Dictionary<string, object> parameterC# WCF 传递 Dictionary<string, object> 参数
【发布时间】:2017-03-06 08:39:53
【问题描述】:

我正在尝试将字典发送到 WCF 服务。但是,如果对象类型是数组或列表,它会显示错误“尝试序列化参数时出现错误......”

尝试序列化参数时出错 http://tempuri.org/:str。 InnerException 消息是“类型 带有数据合同名称的“System.String[]” 'ArrayOfstring:http://schemas.microsoft.com/2003/10/Serialization/Arrays' 预计不会。将任何静态未知的类型添加到列表中 已知类型 - 例如,通过使用 KnownTypeAttribute 属性 或者通过将它们添加到传递给的已知类型列表中 DataContractSerializer.'。有关详细信息,请参阅 InnerException。

这是我的 WCF 服务:

[OperationContract]
int PDFImport(string server, 
              string repo, 
              string username, 
              string password, 
              string templateName, 
              string entryName, 
              byte[] image, 
              Dictionary<string, Object> value, 
              string entryPath = @"\1. Incoming", 
              string volume = "DEFAULT");

也尝试添加一些 ServiceKnowType 属性,但还是不行

[ServiceContract]
[ServiceKnownType(typeof(Dictionary<string, string>))]
[ServiceKnownType(typeof(Dictionary<string, object>))]
[ServiceKnownType(typeof(Dictionary<string, List<string>>))]
[ServiceKnownType(typeof(List<Dictionary<string, List<string>>>))]

请帮帮我。提前致谢。

【问题讨论】:

  • 为什么需要发送类型对象?
  • 我认为他正在发送 System.String[] 作为对象。它在内部异常消息中说。
  • 这是我第一次写WCF服务。它用于与一个 ECM 软件进行通信。因此,对于 Dictionary,字符串表示模板名称,而对象用于值(可以是 DateTime、int、double、list、array 等),这就是我传递对象类型的原因.
  • int、double、float 和其他 premitive 类型应该可以正常工作。 DateTime 是一个结构,这也应该没问题。 List 和 ArrayList 不起作用。

标签: c# wcf dictionary


【解决方案1】:

你在字典中作为对象传递了什么?

WCF 需要知道您传递的是什么类型,以便它可以反序列化该对象,换句话说,WCF 是强类型的。

如果你想试试这个方法

[OperationContract]
 int Method(object o);

并从客户端传递一个 DataContract 类型:

 [DataContract]
    public class MyDataClass
    {
        [DataMember]
        public string Name { get; set; }

        [DataMember]
        public int Id { get; set; }

        [DataMember]
        public DateTime DateOfBirth { get; set; }   
    }

WCF 运行时仍将抛出 CommunicationException,因为 Method(object o) 已捕获所有定义的 WCF 无法反序列化的类型。

如果你像这样用 MyDataClass 替换对象 o

  [OperationContract]
     int Method(MyDataClass myClassObject);

并传入 MyDataClass 对象,它应该可以按预期工作。

现在同样的规则适用于Dictionary&lt;string, Object&gt;。 Tye 定义像 MyDataClass 这样的 DataContract 类型,而不是像上面显示的对象 Dictionary&lt;string, MyDataClass&gt; 以便 WCF 可以反序列化它,通过网络发送到服务方法。

如果您想保持通用,请使用手动序列化方法 Stream、XML 或 byte[]。

希望这会有所帮助!

【讨论】:

  • 感谢您的回复。我会试试的。
【解决方案2】:

很遗憾,WCF 不支持泛型。但是有一种方法可以创建字典作为输入。我不确定这是否是您想要的,但我遇到了同样的问题,我可以通过这种方式解决。

[Serializable]
public class WebServiceInputGetDataParams : ISerializable
{
    public Dictionary<string, object> Entries
    {
        get { return entries; }
    }


    private Dictionary<string, object> entries;
    public WebServiceInputGetDataParams()
    {
        entries = new Dictionary<string, object>();
    }
    protected WebServiceInputGetDataParams(SerializationInfo info, StreamingContext context)
    {
        entries = new Dictionary<string, object>();
        foreach (var entry in info)
        {
            entries.Add(entry.Name, entry.Value);
        }
    }
    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        foreach (var entry in entries)
        {
            info.AddValue(entry.Key, entry.Value);
        }
    }
}

它是一个输入类。你可以创建一个这样的方法:

public void TestMethod(WebServiceInputGetDataParams input)
{
    //access the input through dictiobnary
    input.Entries
}

【讨论】:

    猜你喜欢
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-17
    • 2021-08-10
    • 2012-03-01
    相关资源
    最近更新 更多