2010-09-30 37 views
1

J'ai un service Web ASMX qui nécessite un en-tête de savon et une application cliente consommant ce service via une référence de service (WCF).Client WCF consommant un service Web ASMX avec en-tête de savon

Serveur:

[WebService(Namespace = "http://myserviceurl.org/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
public class Service1 : System.Web.Services.WebService 
{ 
    public MyCustomSoapHeader MyHeader; 

    [WebMethod] 
    [SoapHeader("MyHeader", Direction = SoapHeaderDirection.In)] 
    public string MyMethod() 
    { 
     if(MyHeader.SomeProperty == false) 
     { 
      return "error"; 
     } 
     return "success"; 
    } 

    public class MyCustomSoapHeader: SoapHeader 
    { 
     public bool SomeProperty { get; set; } 
    } 
} 

Client:

public class MyClient 
{ 
    var address = new EndpointAddress(_myServerUrl) 

    var binding = new BasicHttpBinding(); 
    binding.Name = "SoapBinding"; 
    binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly; 
    binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Ntlm; 
    binding.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard; 
    binding.ReceiveTimeout = TimeSpan.FromSeconds(_timeout); 

    Service1SoapClient client = new Service1SoapClient(binding, address); 

    string expected = client.MyMethod(new MyCustomSoapHeader(){SomeProperty = true}); 
} 

Trace de la pile:

System.ServiceModel.FaultException: Server was unable to process request. ---> Computer name could not be obtained. 

Server stack trace: 
    at System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ProxyRpc& rpc) 
    at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout) 
    at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs) 
    at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation) 
    at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message) 

Comment puis-je résoudre ce problème sur le côté client à l'aide encore WCF? Je suis incapable de changer le code du serveur et j'ai besoin d'utiliser WCF sur le client, je ne peux pas ajouter de référence Web.

Répondre

0

Il ne semble pas que votre problème à ce stade soit lié à l'en-tête SOAP du tout ... que l'erreur "Le nom de l'ordinateur n'a pas pu être obtenu" provient d'ailleurs.

Que spécifiez-vous sur le client comme URL de service? Le service fonctionne-t-il sur la même machine que le client, ou un autre? Le service fonctionne-t-il avec d'autres clients non-WCF?

+0

L'URL pour le client est "http: //MyServer/Services/Service1.asmx". Pour le développement, le client s'exécute sur la même machine que le service. Cependant, dans la production ce ne sera pas. J'ai l'intuition que c'est un problème environnemental et non un problème de WCF, mais ce serait formidable si nous pouvions faire fonctionner le service et le client sur la même boîte à des fins de développement/test. Le service fonctionne bien avec les clients non-WCF. – Adam

+0

Étant donné que les deux sont sur la même machine, cela fonctionne-t-il si vous spécifiez l'URL avec localhost au lieu de MyServer? On dirait qu'un problème de DNS pourrait être gênant. – tomasr

+0

J'ai juste essayé de changer le point de terminaison en localhost. Même exception – Adam

1

Basé sur une autre question que je viens de répondre (au sujet de la lecture des en-têtes SOAP), cette approche devrait fonctionner pour votre exigence d'inclure un en-tête SOAP lorsque vous appelez un service ASMX d'un client WCF:

Service1SoapClient client = new Service1SoapClient(binding, address); 

using(OperationContextScope scope = new OperationContextScope(client.InnerChannel)) 
{ 
    // set the message in header 
    MessageHeader header = MessageHeader.CreateHeader("MyHeader", "urn:Sample-NS", "Some Value"); 
    OperationContext.Current.OutgoingMessageHeaders.Add(header); 

    string expected = client.MyMethod(new MyCustomSoapHeader(){SomeProperty = true}); 
} 

J'espère cela fonctionne - Je n'ai pas vraiment l'infrastructure à portée de main pour le tester maintenant ...

+0

Juste essayé cela. Même exception Pouvez-vous expliquer les paramètres de la méthode CreateHeader? Peut-être que j'ai mis la mauvaise chose dans ma mise en œuvre actuelle. La mienne ressemble à MessageHeader.CreateHeader (_header.GetType(). Name, "urn: Sample-NS", _header); – Adam