ошибка при возврате типа XElement в качестве объекта в службе WCF - PullRequest
1 голос
/ 13 июля 2011

Вот мой рабочий контракт:

[ServiceContract]
public interface IService
{

    [OperationContract]
    object Move();

}

Вот реализация контракта на эксплуатацию. Я хочу вернуть XElement как объект, оставив клиенту преобразовать объект обратно в XElement

public object Move()
    {
        object _x;

            var xmlTree1 = new XElement("Root",
                                        new XElement("Child", 1),
                                        new XElement("Child", 2),
                                        new XElement("Child", 3),
                                        new XElement("Child", 4),
                                        new XElement("Child", 5),
                                        new XElement("Child", 6)
                );

            var xmlTree2 = new XElement("Root",
                                        from el in xmlTree1.Elements()
                                        where ((int) el >= 3 && (int) el <= 5)
                                        select el


                );

            _x = xmlTree2;

            return _x;

    }

Вот код клиента:

XElement _xmlelem;

ServiceClient sc = new ServiceClient();

_xmlelem = (XElement)sc.Move();

Ниже приведена стековая строка сообщения об ошибке:

Server stack trace: 
   at System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException(WebException webException, HttpWebRequest request, HttpAbortReason abortReason)
   at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
   at System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout)
   at System.ServiceModel.Channels.ClientReliableChannelBinder`1.RequestClientReliableChannelBinder`1.OnRequest(TRequestChannel channel, Message message, TimeSpan timeout, MaskingMode maskingMode)
   at System.ServiceModel.Channels.ClientReliableChannelBinder`1.Request(Message message, TimeSpan timeout, MaskingMode maskingMode)
   at System.ServiceModel.Channels.ClientReliableChannelBinder`1.Request(Message message, TimeSpan timeout)
   at System.ServiceModel.Security.SecuritySessionClientSettings`1.SecurityRequestSessionChannel.Request(Message message, TimeSpan timeout)
   at System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs)
   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 ConsoleApplication1.ServiceReference1.IService.Move()
   at ConsoleApplication1.ServiceReference1.ServiceClient.Move() in C:\Delete\ConsoleApplication1\Service References\ServiceReference1\Reference.cs:line 128
   at ConsoleApplication1.Program.Main(String[] args) in C:\Delete\ConsoleApplication1\Program.cs:line 20
   at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
   at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()

1 Ответ

2 голосов
/ 13 июля 2011

Вы просите службу WCF десериализовать тип .NET (в вашем случае XElement) к запрашивающему клиенту, а затем заставить клиента преобразовать возвращаемое значение типа объекта .NET в тип XElement.WCF не поддерживает этот тип десериализации, если вы не сконфигурируете его для сериализации .NET с помощью с использованием NetDataContractSerializer вместо стандартного DataContractSerializer.

Существует множество ограничений на использование NetDataContractSerializer , поэтому обычно это не очень хорошая практика.Я верю, что вам лучше возвращать прямой XML.Ответ в этом вопросе показывает, как обращаться с XML в контракте данных.

...