"Microsoft.Web.Services3.Адресация.Адрес" не может быть сериализован

StackOverflow https://stackoverflow.com/questions/1731756

  •  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?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top