"Microsoft.Web.Services3.Адресация.Адрес" не может быть сериализован
-
20-09-2019 - |
Вопрос
Я пытаюсь написать веб-службу-оболочку WCF для веб-службы WSE3 / ASMX.[Неприятная причина заключается в том, что сторонний поставщик не поддерживает SSL, а это то, что необходимо адаптеру WCF BizTalk 2009 для работы с WS-Security.Итак, если поставщик не изменится - мне нужно вызвать локальную веб-службу WCF ...]
Я следовал этой статье, чтобы встроить WSE3 proxy-builder в VS2008:http://blogs.imeta.co.uk/jyoung/archive/2008/08/29/345.aspx Я создаю веб-ссылку на удаленную веб-службу поставщика .asmx.
Я создаю и публикую свой веб-сервис локально, и просто пытаюсь вызвать его в браузере, и получаю эту ошибку:
Система.Исключение InvalidOperationException:В исключение при вызове Расширение экспорта WSDL-файл :Система.Модель обслуживания.Описание.Datacontractserializerоперационное поведение контракт: http://tempuri.org/:IValuationService ----> Система.Среда выполнения.Сериализация.Исключение InvalidDataContractException:Тип 'Microsoft.Web.Services3.Адресация.Адрес' не может быть сериализован.Подумайте о том, чтобы пометить его атрибутом DataContractAttribute и пометить все его элементы, которые вы хотите сериализовать, атрибутом DataMemberAttribute.Смотрите Microsoft .NET Framework документацию для других поддерживаемых типов.
Как я могу сделать объект, который я не писал ('Microsoft.Web.Services3.Адресация.Адрес') сериализуемым?Возможно ли выполнить то, что я пытаюсь?
Спасибо,
Нил Уолтерс
Дополнительная информация - Понедельник, 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.Адресация.Адрес' находится здесь, в метаданных, когда я выполняю "переход к определению" 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.Адресация.Адрес"?Похоже, что EndpointReference находится в объекте 'Microsoft.Web.Services3.Адресация.Address'.Поэтому, если я использую сгенерированный код WSE3, он пытается сериализовать его.
Поэтому я думаю, что решением будет написать еще одну оболочку, свободную от WSE3, и предоставить ее через WCF.Но хитрость в том, что веб-службы поставщиков имеют множество больших и сложных объектов, которые теперь все наследуются от Microsoft.Web.Services3.WebServicesClientProtocol (поскольку я использую генератор кода WS3).Я действительно не хочу вручную создавать их все снова.В приведенном выше примере "ValuationService" является лишь одним из таких объектов.
Решение 2
Ладно, вот в чем была проблема.Я становился немного пасмурным и терялся в сложности этого приложения, которое предоставляет 4 сервиса и десятки методов, и впервые в жизни использовал WSE3 из WCF.
Ошибка заключалась в том, что оболочка, которую я написал, пыталась вернуть саму ValuationService.Это была глупая ошибка.ValuationService действительно реализовал Microsoft.Web.WebServices3.WebServicesClientProtocol, который включал класс адресации, который вызывал проблему.
Предполагалось, что оболочка будет использовать ValuationService в качестве клиента и возвращать только Оценку (или ValuationResult).valuationResult - это, конечно, просто объект, состоящий из строк, десятичных дробей, логических значений и т.д...который может быть сериализован.
Другие советы
Вы не можете сделать что-то сериализуемым "постфактум".Вопрос в том,:зачем вам нужен этот "Адрес"?
Не могли бы вы изменить свою оболочку WCF так, чтобы вы передавали адрес (если это URL, как я подозреваю) в виде строки от вашего клиента вашему сервису WCF, а затем создали экземпляр "Address" внутри вашего класса обслуживания WCF?