2017-01-11 4 views
0

J'ai créé une référence de service WCF à partir d'un fichier WSDL fourni. en C# i ai créé une instance du client proxy avec une liaison de base et appelé la méthode requise:Erreur d'appel de service Web

public static bool main() 
    { 
     Debugger.Launch(); 
     var binding = new BasicHttpsBinding(); 

     binding.Security.Mode = BasicHttpsSecurityMode.Transport; 
     binding.TextEncoding = System.Text.Encoding.UTF8; 

     var remoteAddress = new System.ServiceModel.EndpointAddress("https://tester.mysite.de:8443/webservice/OrderNumber"); 

     using (var orderNumberClient = new orderNumberClient(new System.ServiceModel.BasicHttpBinding(BasicHttpSecurityMode.Transport), remoteAddress)) 
     { 
      string IDSystem = "123"; 
      string IDOSystem = "abc"; 

      //set timeout 
      orderNumberClient.Endpoint.Binding.SendTimeout = new TimeSpan(0, 0, 0, 10000); 
      orderNumberClient.ClientCredentials.UserName.UserName = "test"; 
      orderNumberClient.ClientCredentials.UserName.Password = "test"; 

      //call web service method 
      string productResponse = orderNumberClient.getNewOrderNumber(IDSystem, "01", IDOSystem); ; 

      MessageBox.Show(productResponse); 
     } 

     return true; 
    } 

Malheureusement, je reçois une erreur assez inutile quand j'appelle la méthode « getNewOrderNumber »:

System.Reflection.TargetInvocationException: Ein Aufrufziel hat einen Ausnahmefehler verursacht. ---> System.ServiceModel.FaultException: traitement WebService Exception

trace de pile du serveur:

bei System.ServiceModel.Channels.ServiceChannel.HandleReply (opération ProxyOperationRuntime , ProxyRpc & RPC)

bei System.ServiceModel.Channels.ServiceChannel.Call (Action de chaîne, Boolean oneway, opération ProxyOperationRuntime, Object [] ins, Object [] outs, TimeSpan timeout)

bei System.ServiceModel.Channels.ServiceChannelProxy.InvokeService (IMethodCallMessage methodCall, opération ProxyOperationRuntime)

...

Ce n'est pas une erreur sur le côté service Web qui fonctionne très bien comme dans SoapUI, suis-je peut-être manquer quelque chose dans la liaison?

Espérons que quelqu'un de mieux informé sur les services Web peut mettre en lumière la cause première.

+0

Je suis d'accord que c'est une exception assez vague. Je crois que celui-ci devrait avoir une exception intérieure qui sera plus utile. Note: Il peut être imbriqué à quelques couches de profondeur. Continuez à vérifier vos exceptions internes jusqu'à ce que vous n'en ayez plus. – Vahlkron

+0

Il n'y avait rien à voir de substance dans l'exception intérieure non plus :(Heureusement, j'ai découvert par le client que je manquais un en-tête obligatoire! Je posterai une réponse. –

Répondre

0

Il s'avère que je n'envoyais pas l'en-tête 'Autorisation' avec l'appel. Pour surmonter le problème je l'ai utilisé la classe OperationContextScope pour ajouter le HttpRequestMessageProperty nécessaire pour les instances de proxy canal interne avant de faire la méthode service Web réel appel:

   using (OperationContextScope scope = new OperationContextScope(orderNumberClient.InnerChannel)) 
       { 
        var httpRequestProperty = new HttpRequestMessageProperty(); 
        httpRequestProperty.Headers[System.Net.HttpRequestHeader.Authorization] = "Basic " + 
        Convert.ToBase64String(Encoding.ASCII.GetBytes(orderNumberClient.ClientCredentials.UserName.UserName + ":" + 
        orderNumberClient.ClientCredentials.UserName.Password)); 
        OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = httpRequestProperty; 

        string Response = orderNumberClient.getNewOrderNumber(IDSystem, "01", IDOSystem); 
       }