Ошибка WCF в теле десериализации сообщения запроса для операции - PullRequest
3 голосов
/ 19 января 2011

У меня есть клиентское веб-приложение asp.net и веб-сервис WCF, разработанный на основе схемы xsd. При звонке в сервис я получаю ошибку в десериализации тела запроса. Я пытался обновить справочную службу, но это не помогло.

Это мой код:

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, но при реализации клиента мой intellisense запрашивает объект 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 строк кода, сгенерированного из схемы), который, я уверен, вызывает проблему, но я попытался закомментировать функцию устранения неполадок, обновить ссылку на службу и мой intellisense все еще хочет 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;
    }
}

1 Ответ

1 голос
/ 19 января 2011

Два вопроса:

  1. Почему вы создаете GetCapabilitiesRequest объект, который содержит подобъект GetCapabilities, а затем при вызове метода вы используете только содержащийся подобъект GetCapabilities ??

    Так почему бы просто не создать GetCapabilities во-первых и забыть об объекте упаковки ??

  2. Также, пожалуйста, покажите нам GetCapabilitiesRequest и GetCapabilities и класс возврата Capabilities тоже? Если у вас ошибка десериализации, скорее всего, что-то с этими классами не так ...

Обновление: спасибо за обновление вашего вопроса .... хм ... не могу найти что-то явно неправильное на первый взгляд ....

О вашем вопросе:

Что я не понимаю, так это GetCapabilities занимает GetCapabilitiesRequest параметр, но когда я внедряю клиента, мой intellisense просит OSEOP.GetCapabilities объект.

Да, это понятно - ваша сторона обслуживания использует свой набор классов - GetCapabilitiesRequest и т. Д.

Когда вы делаете Add Service Reference в Visual Studio, VS делает

  • опросить сервер, чтобы узнать об услуге - какие у нее методы и какие параметры ей нужны

  • создает набор копий ваших классов для клиентского прокси-сервера - в том пространстве имен, которое вы определяете в диалоговом окне Add Service Reference. Это классы, которые выглядят точно так же, как ваши серверные классы - но они не - это те же классы - они просто сериализуются в XML (и десериализуются из XML) так же, как и на сервере. Вот почему ваш клиентский прокси имеет разные классы в другом пространстве имен. Это стандартное поведение WCF - не о чем беспокоиться ...

Обновление №. 2 : Карлос, схема, которую вы мне прислали, кажется неполной или содержит ошибки. Попробуйте использовать OGC project на CodePlex в качестве основы и встроить свой код вручную или подождите, пока схема не станет «официально» опубликованной.

...