Я пытаюсь написать веб-службу оболочки 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» является лишь одним из таких объектов.