【问题标题】:WCF Error in deserializing body of request message for operation反序列化操作请求消息正文时出现 WCF 错误
【发布时间】:2011-01-19 19:21:37
【问题描述】:

我有一个 asp.net 客户端 Web 应用程序和一个从模式 xsd 开发的 WCF Web 服务。调用该服务时,我在反序列化请求正文时遇到错误。我尝试更新服务参考,但没有帮助。

这是我的代码:

OSEOP.HMA_OrderingBindingClient client = new OSEOP.HMA_OrderingBindingClient();

OSEOP.GetCapabilitiesRequest request = new OSEOP.GetCapabilitiesRequest();
request.GetCapabilities = new OSEOP.GetCapabilities();
request.GetCapabilities.service = "OS";

string[] arrAcceptedVersions = { "1.0.0", "2.0.0" };
request.GetCapabilities.AcceptVersions = arrAcceptedVersions;

OSEOP.Capabilities capabilities = client.GetCapabilities(request.GetCapabilities);


txtGetCapabilitiesResponse.Text = capabilities.Contents.ToString();

client.Close();

这是错误:

System.ServiceModel.FaultException`1 was unhandled by user code
  Message=Error in deserializing body of request message for operation 'GetCapabilities'.
  Source=mscorlib
  StackTrace:
    Server stack trace: 
       at System.ServiceModel.Channels.ServiceChannel.ThrowIfFaultUnderstood(Message reply, MessageFault fault, String action, MessageVersion version, FaultConverter faultConverter)
       at System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ProxyRpc& rpc)
       at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
       at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
       at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)
    Exception rethrown at [0]: 
       at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
       at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
       at OSEOP.HMA_OrderingBinding.GetCapabilities(GetCapabilitiesRequest request)
       at OSEOP.HMA_OrderingBindingClient.OSEOP.HMA_OrderingBinding.GetCapabilities(GetCapabilitiesRequest request) in c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\oseop_testclient\023fa9f5\ea876945\App_WebReferences.k9c5tqe1.0.cs:line 44135
       at OSEOP.HMA_OrderingBindingClient.GetCapabilities(GetCapabilities GetCapabilities1) in c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\oseop_testclient\023fa9f5\ea876945\App_WebReferences.k9c5tqe1.0.cs:line 44141
       at _Default.cmdGetCapabilities_Click(Object sender, EventArgs e) in d:\Documents\DEV\SARPilot\SVN_repository\Services\OrderingServices\TestClient\Default.aspx.cs:line 30
       at System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument)
       at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
  InnerException: 

如您所见,错误发生在客户端并且永远不会发送到 WCF 服务。出于这个原因,我的 MessageLogging 中没有任何内容。这就是为什么我认为它与服务参考有关。

谁能帮忙?

编辑#1: 我不明白的是 GetCapabilities 需要一个 GetCapabilitiesRequest 参数,但是当我实现客户端时,我的智能感知要求一个 OSEOP.GetCapabilities 对象。

OSEOP 是我命名的网络参考。

public class OrderingService : HMA_OrderingBinding
{
    public GetCapabilitiesResponse GetCapabilities(GetCapabilitiesRequest request)
    {
        throw new NotImplementedException();
    }
}

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
[System.ServiceModel.ServiceContractAttribute(Namespace = "http://www.opengis.net/oseop/1.0", ConfigurationName = "HMA_OrderingBinding")]
public interface HMA_OrderingBinding
{
    [OperationContract]
    [XmlSerializerFormatAttribute]
    GetCapabilitiesResponse GetCapabilities(GetCapabilitiesRequest request);
}



/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("svcutil", "3.0.4506.2152")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://www.opengis.net/oseop/1.0")]
public partial class Capabilities : CapabilitiesBaseType
{

    private OrderingServiceContentsType contentsField;

    private NotificationProducerMetadataPropertyType notificationsField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Order = 0)]
    public OrderingServiceContentsType Contents
    {
        get
        {
            return this.contentsField;
        }
        set
        {
            this.contentsField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Order = 1)]
    public NotificationProducerMetadataPropertyType Notifications
    {
        get
        {
            return this.notificationsField;
        }
        set
        {
            this.notificationsField = value;
        }
    }
}

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
[System.ServiceModel.MessageContractAttribute(IsWrapped = false)]
public partial class GetCapabilitiesRequest
{

    [System.ServiceModel.MessageBodyMemberAttribute(Namespace = "http://www.opengis.net/oseop/1.0", Order = 0)]
    public GetCapabilities GetCapabilities;

    public GetCapabilitiesRequest()
    {
    }

    public GetCapabilitiesRequest(GetCapabilities GetCapabilities)
    {
        this.GetCapabilities = GetCapabilities;
    }
}

编辑 #2 @Marc: 马克,你的回答很有帮助。但是您会看到服务器端是这样的:

GetCapabilitiesResponse GetCapabilities(GetCapabilitiesRequest request) 

但我的智能感知认为它是这样的:

Capabilities GetCapabilities(GetCapabilities GetCapabilities1)

我在 IOrder.cs 文件中找到了一段代码(从架构生成的 47,256 行代码),我确定这是导致问题的原因,但我尝试注释掉故障函数,更新服务参考,而我的智能感知仍然需要 GetCapabilities GetCapabilities1

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public partial class HMA_OrderingBindingClient : System.ServiceModel.ClientBase<HMA_OrderingBinding>, HMA_OrderingBinding
{

    public HMA_OrderingBindingClient()
    {
    }

    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    GetCapabilitiesResponse HMA_OrderingBinding.GetCapabilities(GetCapabilitiesRequest request)
    {
        return base.Channel.GetCapabilities(request);
    }

    public Capabilities GetCapabilities(GetCapabilities GetCapabilities1)
    {
        GetCapabilitiesRequest inValue = new GetCapabilitiesRequest();
        inValue.GetCapabilities = GetCapabilities1;
        GetCapabilitiesResponse retVal = ((HMA_OrderingBinding)(this)).GetCapabilities(inValue);
        return retVal.Capabilities;
    }
}

【问题讨论】:

    标签: asp.net wcf web-services serialization wcf-binding


    【解决方案1】:

    两个问题:

    1. 为什么要创建一个包含子对象GetCapabilitiesGetCapabilitiesRequest对象,然后在你的方法调用中,只使用包含的子对象GetCapabilities??

      那么为什么不首先创建GetCapabilities 而忘记包装对象呢?

    2. 另外,您能否向我们展示GetCapabilitiesRequestGetCapabilities 以及返回类Capabilities?如果您遇到反序列化错误,很可能这些类的某些内容不正确...

    更新:感谢您更新您的问题.... 嗯……乍一看似乎找不到任何明显的错误……

    关于您的问题:

    我不明白的是 GetCapabilities 需要一个 GetCapabilitiesRequest 参数但是 当我实施客户端时,我的 智能感知要求一个 OSEOP.GetCapabilities 对象。

    是的,这很清楚 - 您的 服务端 使用它的一组类 - GetCapabilitiesRequest 等等。

    当您在 Visual Studio 中执行 Add Service Reference 时,VS 所做的是

    • 询问服务器以了解服务 - 它有哪些方法以及需要哪些参数

    • 它会在您在Add Service Reference 对话框中定义的命名空间中为客户端代理创建一组您的类的副本。这些类看起来与您的服务器端类完全相同——但它们是相同的类——它们只是以与服务器上的相同的方式序列化为 XML(并从 XML 反序列化)。这就是为什么您的客户端代理在不同的命名空间中有不同的类。这是标准的 WCF 行为 - 没什么好担心的......

    更新编号。 2:卡洛斯,你发给我的架构似乎不完整或有错误。尝试使用OGC project on CodePlex 作为基础并手动构建代码或等到架构“正式”发布。

    【讨论】:

    • 1:GetCapabilitiesRequest 和所有代码都是使用 svcutil 工具创建的。我希望我明白为什么,但我没有发言权。我同意,这没有任何意义,我会以不同的方式做。 2:我将发布和编辑以向您展示 GetCapabilitiesRequest 等。
    • 请检查我对问题的编辑。
    • @capdragon:至少回答了你的一个问题(希望如此!)
    • 感谢您的解释,我做了另一个编辑(只为您)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    相关资源
    最近更新 更多