Pergunta

Estou tentando escrever um serviço web wrapper WCF para um serviço da Web WSE3/ASMX. [A razão feia é que um fornecedor de terceiros não apoiará o SSL e é isso que é necessário para o adaptador WCF BizTalk 2009 trabalhar com a segurança do WS. Portanto, se o fornecedor não mudar - eu preciso ligar para um serviço WCF local da WCF ...

Eu segui este artigo para contratar o Builder de Proxy WSE3 no VS2008:http://blogs.imeta.co.uk/jyoung/archive/2008/08/29/345.aspxFaço uma referência na Web ao serviço da Web .asmx do fornecedor .asmx.

Construo e publico meu serviço da web localmente, e apenas tento trazê -lo no navegador e recebo este erro:

System.InValidoPoperationException: Uma exceção foi lançada em uma chamada para uma extensão de exportação WSDL: System.Servicemodel.Description.DATACONTRATRIGRATERILIZEROPERAÇÃOBEHAVIRAIRA CONTRATO: http://tempuri.org/:VorationaationService----> System.Runtime.Serialization.InValidDatacOntractException: Digite 'Microsoft.Web.Services3.Addressing.address' não pode ser serializado. Considere marcá -lo com o atributo DataCOntetattribute e marcar todos os seus membros que você deseja serializar com o atributo DatameMberattribute. Consulte a documentação da estrutura do Microsoft .NET para outros tipos suportados.

Como posso fazer um objeto que não escrevi ('Microsoft.Web.Services3.Addressing.Address') serializável? É possível realizar o que estou tentando?

Obrigado,

Neal Walters


Informações adicionais - segunda -feira, 16 de novembro de 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 {
...

O único lugar em que posso encontrar qualquer referência para 'Microsoft.Web.Services3.Addressing.Address' está aqui, nos metadados quando eu faço uma "vá para a definição" do 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;
    }
}

Então, em outras palavras, como me livrar do 'Microsoft.Web.Services3.Addressing.Address'? Parece que o EndPointference está no objeto 'Microsoft.Web.Services3.Addressing.Address'. Portanto, se eu usar o código gerado pelo WSE3, ele tentará serializar -o.

Então, acho que a solução será escrever mais um invólucro livre do WSE3 - e expor -o via WCF. Mas o truque é que os Serviços da Web dos fornecedores têm vários objetos grandes e complexos - que agora todos herdam da Microsoft.Web.Services3.WebServicesClientProtocol (já que estou usando o gerador de código WS3). Eu realmente não quero construir manualmente todos eles novamente. No exemplo acima, "avaliações" é apenas um desses objetos.

Foi útil?

Solução 2

Ok, aqui estava o problema. Eu estava ficando um pouco nublado e perdido na complexidade deste aplicativo, que expõe 4 serviços e dezenas de métodos, e a primeira vez a usar o WSE3 da WCF.

O erro foi porque o invólucro que escrevi estava tentando devolver o próprio serviço de avaliação. Isso foi um erro idiota. O valor de avaliação implementou o Microsoft.Web.WebServices3.WebServicesClientProtocol, que incluía a classe de endereçamento que estava causando o problema.

O invólucro deveria usar o avaliação como cliente e devolver apenas a avaliação (ou avaliação resulta). O valor da avaliação é obviamente apenas um objeto que consiste em cordas, decimais, booleanos, etc ... que podem ser serializados.

Outras dicas

Você não pode tornar algo serializável "depois do fato". A questão é: para que você precisa desse "endereço"?

Você poderia alterar seu invólucro WCF para que você passe um endereço (se isso for um URL como eu suspeito) como uma string do seu cliente para o seu serviço WCF e, em seguida, criar uma instância de "endereço" dentro da sua classe de serviço WCF ?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top