c# – WCF服务不对反释值进行反序列化

c# – WCF服务不对反释值进行反序列化,第1张

概述我构建了一个WCF服务,并且有一个看起来像这样的部分: [ServiceContract]public class Service { [OperationContract] public SomethingElse[] Method(Code a, params Something[] b) { ... }}[DataContract]public class Some 我构建了一个WCF服务,并且有一个看起来像这样的部分:
[ServiceContract]public class Service {    [OperationContract]    public SomethingElse[] Method(Code a,params Something[] b) { ... }}[DataContract]public class Something {    [DataMember]    public string Stuff {get;set;}    [DataMember]    public Status MyStatus {get;set;}    public string ServerSIDeFIEld {get;set;}}[DataContract]public class SomethingElse {    [DataMember]    public Status MyStatus {get;set;}}[DataContract]public enum Status {    [EnumMember] WorksFine,[EnumMember] NotWorking}[DataContract]public enum Code {    [EnumMember] TypeA,[EnumMember] TypeB}

现在我将它用作C#客户端的服务参考.出于某种原因,每当我调用Method时,即使我将其设置为NotWorking,b参数中的MyStatus属性也始终设置为WorksFine.另一方面,每当我为a参数传递Code.TypeA或Code.TypeB时,服务总是正确地反序列化它.

为了尽职调查,关于将枚举传递给WCF服务的其他帖子引用了DataContract,EnumMember(Value =“TypeA”)和ServiceKNownType,所以我给了所有这些帖子.但是,即使我使用ServiceKNownType(如下所示),我仍然遇到同样的问题.

[ServiceContract][ServiceKNownType(typeof(Something)][ServiceKNownType(typeof(Status)]public class Service {    [OperationContract]    public SomethingElse[] Method(Code a,params Something[] b) { ... }}

对于这么基本的东西,这个问题似乎异常模糊.我测试了从服务中传回Status.NotWorking并且客户端能够看到它,因此这似乎是一个单向问题.有什么建议?

编辑1:

类似的问题:WCF not deserializing value types. Mysterious behaviour

编辑2:

从缺乏立即反应来判断,我将包括一些更多的信息,以防其中一些情况发生.

>我在.NET 4.5和4.0上都遇到了这个问题.
>该服务托管在IIS上,具有SSL和自定义身份验证方案.
> Method上还有一个FaultContract属性,但我将其排除在外以使示例更简单.
>事件查看器说zilch. IIS日志也是如此.
> Reference.cs中自动生成的服务引用代码如下所示:

枚举:

/// <remarks/>[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml","4.0.30319.18408")][System.SerializableAttribute()][System.Xml.Serialization.XmlTypeAttribute(namespace="http://schemas.datacontract.org/2004/07/Service")]public enum Status{ TypeA,TypeB }

方法:

// CODEGEN: Parameter 'MethodResult' requires additional schema information that cannot be captured using the parameter mode. The specific attribute is 'System.Xml.Serialization.XmlArrayAttribute'.    [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/Service/Method",ReplyAction="http://tempuri.org/Service/MethodResponse")]    [System.ServiceModel.FaultContractAttribute(typeof(MyClIEntProject.Service.MyFault),Action="http://tempuri.org/Service/MethodMyFaultFault",name="MyFault",namespace="http://schemas.datacontract.org/2004/07/Service.MyFault")]    [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]    MyClIEntProject.Service.Method Method(MyClIEntProject.Service.MethodRequest request);

编辑3:

我构建了另一个仅由上面代码组成的Web服务,但它不会重现我所看到的行为.我的猜想是,其他一些代码正在zilching DataContractSerializer,或者有一些相关的IIS / WCF设置,或者一些未解决的数据合同问题.

我还构建了另一个连接到两个Web服务的Web客户端,它收到的结果与第一个相同.

编辑4

截获fiddler的请求,它看起来像这样:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><Method xmlns="http://tempuri.org/"><a>TypeA</a><b><Something xmlns="http://schemas.datacontract.org/2004/07/TestService.something">   <Stuff>mystuffvalue</Stuff></Something></b></Method></s:Body></s:Envelope>

因此,枚举永远不会被传递!如何解决合同不匹配问题?

编辑5

忘记提到Web服务引用了ASMX服务,并且本身使用XML序列化程序与该外部服务进行通信.

解决方法 关键在这里:

[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults =真)]

XML Serializer用于生成代理而不是DataContractSerializer.你不小心指定了XmlSerializer吗?您是否尝试使用.asmx服务?

一旦你弄清楚是什么导致使用XmlSerializer生成代码,你就会得到你的答案,但是你发布的内容并不是很明显.

总结

以上是内存溢出为你收集整理的c# – WCF服务不对反释值进行反序列化全部内容,希望文章能够帮你解决c# – WCF服务不对反释值进行反序列化所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1245423.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存