Pergunta

Eu tenho um fornecedor dizendo que o cabeçalho do SOAP não deve ter https, mas que ainda podemos nos comunicar via SSL. Nossa preocupação é que queremos nos comunicar via SSL e que o código de exemplo está fazendo com que não aconteça.

Em seu programa de amostra, eles fornecem este código:

    if (valservice.Url.StartsWith("https"))
    {
        valservice.Destination = new Microsoft.Web.Services3.Addressing.EndpointReference(
            new Uri(valservice.Url.Replace("https:", "http:")));
    } 

Ao dividi -lo em etapas menores e adicionar um pouco de depuração, parece que quando você muda o destino, o URL muda automaticamente.

if (valservice.Url.StartsWith("https"))
{
    // fix the endpoint just in case (usually not necessary)
    //original code is just this next line 
    //valservice.Destination = new Microsoft.Web.Services3.Addressing.EndpointReference(
    //    new Uri(valservice.Url.Replace("https:", "http:")));


    //test code 
    string holdOriginalURL = valservice.Url;

    Response.WriteLine("1 URL=" + valservice.Url);
    Response.WriteLine("1 Destination=" + valservice.Destination);
    Response.WriteLine("1 Destination.Address.Value=" + valservice.Destination.Address.Value);
    Response.WriteLine("1 Destination.TransportAddress=" + valservice.Destination.TransportAddress);

    //test 
    string newURL = valservice.Url;
    newURL = newURL.Replace("https:", "http:"); 
    //valservice.Destination = new Microsoft.Web.Services3.Addressing.EndpointReference(
    //    new Uri(newURL));
    Microsoft.Web.Services3.Addressing.EndpointReference tempEndPoint = new Uri(newURL);
    valservice.Destination = tempEndPoint; 
    //valservice.Url = holdOriginalURL; 
    Response.WriteLine("2 URL=" + valservice.Url);
    Response.WriteLine("2 Destination=" + valservice.Destination);
    Response.WriteLine("2 Destination.Address.Value =" + valservice.Destination.Address.Value);
    Response.WriteLine("2 Destination.TransportAddress=" + valservice.Destination.TransportAddress);
}

Resultado:

1 URL=https://someaddress.net/orgid/SomeApplication/SomeService.asmx
1 Destination.Address.Value=https://someaddress.net/orgid/SomeApplication/SomeService.asmx
1 Destination.TransportAddress=https://someaddress.net/orgid/SomeApplication/SomeService.asmx

2 URL=http://someaddress.net/orgid/SomeApplication/SomeService.asmx
2 Destination.Address.Value=http://someaddress.net/orgid/SomeApplication/SomeService.asmx
2 Destination.TransportAddress=http://someaddress.net/orgid/SomeApplication/SomeService.asmx

Pergunta: É possível ter um URL diferente no destino do URL? Se sim, como?

Além disso, se eu redefinir o URL após a atualização do destino, o destino também será alterado. Parece que os dois estão de alguma forma ligados um ao outro e não podem ser diferentes?

Obrigado,

Neal Walters

Atualização 1: Algumas pesquisas indicam que o fornecedor pode ser capaz de adicionar o Atributo de sabão para o site deles.

Quando temos https no URL, eles dão este erro:

O cabeçalho deve corresponder ao valor do URI do ator do serviço da Web. O valor do URI do ator pode ser especificado explicitamente usando o SOAPATORATTRIBUTO na classe ASMX. Na ausência do atributo, o URI do ator é considerado igual ao URL de solicitação HTTP da mensagem de entrada. O cabeçalho recebido continha "https://somesite.net/orgid/someapp/someService.asmx"Enquanto o receptor está esperando"http://somesite.net/orgid/someapp/someService.asmx".

Foi útil?

Solução

A amostra do fornecedor estava realmente errada e não usando SSL. A solução foi adicionar o parâmetro "via" ao construtor do terminal:

 valservice.Destination =
            new Microsoft.Web.Services3.Addressing.EndpointReference(
                new Uri(valservice.Url.Replace("https:", "http:")), 
                new Uri(valservice.Url));

http://msdn.microsoft.com/en-us/library/microsoft.web.services3.addressing.endpointriference.via.aspx

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