«Microsoft.Web.Services3.Addressing.Address» не может быть сериализован - PullRequest
2 голосов
/ 13 ноября 2009

Я пытаюсь написать веб-службу оболочки WCF для веб-службы WSE3 / ASMX. [Неприятная причина, по которой сторонний поставщик не поддерживает SSL, и именно это необходимо для адаптера BizTalk 2009 WCF для работы с WS-Security. Так что, если поставщик не меняется - мне нужно позвонить в местный веб-сервис WCF ...]

Я следовал этой статье, чтобы встроить прокси-сборщик WSE3 в VS2008: http://blogs.imeta.co.uk/jyoung/archive/2008/08/29/345.aspx Я делаю веб-ссылку на удаленный веб-сервис поставщика .asmx.

Я создаю и публикую свой веб-сервис локально, и просто пытаюсь вызвать его в браузере, и получаю эту ошибку:

System.InvalidOperationException: An исключение было брошено в вызове Расширение экспорта WSDL: System.ServiceModel.Description.DataContractSerializerOperationBehavior контракт: http://tempuri.org/:IValuationService ----> System.Runtime.Serialization.InvalidDataContractException: Тип 'Microsoft.Web.Services3.Addressing.Address' не может быть сериализовано. Рассмотрим маркировку это с DataContractAttribute атрибут, и маркировка всех его члены, которые вы хотите сериализовать с Атрибут DataMemberAttribute. Увидеть Microsoft .NET Framework документация для других поддерживаемых типы.

Как сделать сериализуемый объект, который я не написал («Microsoft.Web.Services3.Addressing.Address»)? Можно ли выполнить то, что я пытаюсь?

Спасибо

Нил Уолтерс


Дополнительная информация - понедельник, 16 ноября 2009 г .:
[ServiceContract]
public interface IValuationService
{
    [OperationContract]
    ExpressLync.ValuationServiceWse GetPropertyInfoSourceRecordPolicyNum(string PolicyNumber);
}
// end of interface 

// here is part of reference.cs...
public partial class ValuationServiceWse : Microsoft.Web.Services3.WebServicesClientProtocol {
...

Единственное место, где я могу найти какую-либо ссылку на «Microsoft.Web.Services3.Addressing.Address» здесь, в метаданных, когда я делаю «перейти к определению» Microsoft.Web.Services3.WebServicesClientProtocol

using Microsoft.Web.Services3.Addressing;
using Microsoft.Web.Services3.Design;
using System;
using System.Net;
using System.Web.Services.Protocols;
using System.Xml;

namespace Microsoft.Web.Services3
{
    public class WebServicesClientProtocol : SoapHttpClientProtocol
    {
        public WebServicesClientProtocol();

        public EndpointReference Destination { get; set; }
        public Pipeline Pipeline { get; set; }
        public SoapContext RequestSoapContext { get; }
        public bool RequireMtom { get; set; }
        public SoapContext ResponseSoapContext { get; }
        public string Url { get; set; }
        public bool UseDefaultCredentials { get; set; }

        public TSecurityToken GetClientCredential<TSecurityToken>() where TSecurityToken : Microsoft.Web.Services3.Security.Tokens.SecurityToken;
        protected override XmlReader GetReaderForMessage(SoapClientMessage message, int bufferSize);
        public TSecurityToken GetServiceCredential<TSecurityToken>() where TSecurityToken : Microsoft.Web.Services3.Security.Tokens.SecurityToken;
        protected override WebRequest GetWebRequest(Uri uri);
        protected override WebResponse GetWebResponse(WebRequest request);
        protected override WebResponse GetWebResponse(WebRequest request, IAsyncResult result);
        protected override XmlWriter GetWriterForMessage(SoapClientMessage message, int bufferSize);
        public void SetClientCredential<TSecurityToken>(TSecurityToken clientToken) where TSecurityToken : Microsoft.Web.Services3.Security.Tokens.SecurityToken;
        public void SetPolicy(Policy policy);
        public void SetPolicy(string policyName);
        public void SetServiceCredential<TSecurityToken>(TSecurityToken serviceToken) where TSecurityToken : Microsoft.Web.Services3.Security.Tokens.SecurityToken;
    }
}

Другими словами, как мне избавиться от «Microsoft.Web.Services3.Addressing.Address»? Похоже, что EndpointReference находится в объекте Microsoft.Web.Services3.Addressing.Address. Поэтому, если я использую код, сгенерированный WSE3, он пытается его сериализовать.

Так что я думаю, что решение будет состоять в том, чтобы написать еще одну оболочку, которая не содержит WSE3 - и выставить ее через WCF. Но хитрость в том, что у веб-сервисов поставщиков есть множество больших и сложных объектов, которые теперь все наследуются от Microsoft.Web.Services3.WebServicesClientProtocol (поскольку я использую генератор кода WS3). Я действительно не хочу создавать их все вручную. В приведенном выше примере «ValuationService» является лишь одним из таких объектов.

Ответы [ 2 ]

1 голос
/ 16 ноября 2009

Хорошо, здесь была проблема. Я становился немного пасмурным и терялся в сложности этого приложения, которое предоставляет 4 сервиса и десятки методов, и впервые использовал WSE3 из WCF.

Ошибка была в том, что написанная мной оболочка пыталась вернуть сам ValuationService. Это была глупая ошибка. Служба ValuationService реализовала Microsoft.Web.WebServices3.WebServicesClientProtocol, который включал класс Addressing, который вызывал проблему.

Оболочка должна была использовать ValuationService в качестве клиента и возвращать только Valuation (или ValuationResult). Оценочный результат - это, конечно, просто объект, состоящий из строк, десятичных чисел, логических значений и т. Д., Которые можно сериализовать.

1 голос
/ 14 ноября 2009

Вы не можете сделать что-то сериализуемое "по факту". Вопрос в том, зачем вам этот «адрес»?

Не могли бы вы изменить свою оболочку WCF так, чтобы вы передавали адрес (если я подозреваю, что это URL-адрес) в виде строки из вашего клиента в службу WCF, а затем создавали экземпляр "Address" внутри WCF класс обслуживания?

...