"Microsoft.Web.Services3.Addressing.Address" не может быть сериализован

Asked
Viewd1183

2

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

Я следил за этой статьей, чтобы получить встроенный в VS2008 конструктор прокси WSE3: 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

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

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

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

1

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

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

  • Решено - см. мой ответ ниже.

    NealWalters16 ноября 2009, 15:44
  • Как избавиться от «Microsoft.Web.Services3.Addressing.Address»?Вроде бы «вставляет себя».Я не хотел особо включать это.

    NealWalters16 ноября 2009, 14:29