2016-06-07 1 views
0

Je dois insérer cette demande côté client côté pour le service web de savon.Comment puis-je faire?comment peut insérer cet en-tête de savon dans la demande côté client à C#

<soap:Header xmlns:wsa="http://www.w3.org/2005/08/addressing"> 
    <wsse:Security soap:mustUnderstand="true" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" 
    xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> 
    <wsse:UsernameToken wsu:Id="UsernameToken-A116E02D59482B66FF14652216221791"><wsse:Username>test</wsse:Username> 
    <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">test2</wsse:Password> 
    <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">7og8drnSMbkytwYPlDrCCg==</wsse:Nonce><wsu:Created>2016-06-06T14:00:22.177Z</wsu:Created> 
    </wsse:UsernameToken></wsse:Security> 
    <wsa:Action soap:mustUnderstand="1">http://tempuri.org/IQuantityService/LoadDebitAmount</wsa:Action></soap:Header> 

code côté client: J'utilisant wsHttpBinding pour le web de savon service.So Je dois envoyer la demande avec en-tête de savon à above.How puis-je faire?

private void btnLoadAmountTest_Click(object sender, EventArgs e) 
    { 
     System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate(object s, System.Security.Cryptography.X509Certificates.X509Certificate certificate, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors) { return true; }; 

     try 
     { 

      WSHttpBinding userNameBinding = new WSHttpBinding(); 
      userNameBinding.Security.Mode = SecurityMode.Transport; 
      userNameBinding.Security.Message.ClientCredentialType = MessageCredentialType.UserName; 

      EndpointAddress endpointAddress = new EndpointAddress(portB.ToString()); 

      QuantityServiceClient client = new ServiceReferenceLoadQuantity.QuantityServiceClient(userNameBinding, endpointAddress); 
       client.ChannelFactory.Endpoint.Behaviors.Remove<System.ServiceModel.Description.ClientCredentials>(); 
      client.ChannelFactory.Endpoint.Behaviors.Add(new CustomCredentials()); 
      client.ClientCredentials.UserName.UserName = txtUser2.Text; 
      client.ClientCredentials.UserName.Password = txtPsw2.Text; 


      //using (OperationContextScope scope = new OperationContextScope(client.InnerChannel)) 
      //{ 

      // var httpRequestProperty = new HttpRequestMessageProperty(); 
      // httpRequestProperty.Headers[System.Net.HttpRequestHeader.Authorization] = 
      //  "Basic " + 
      //  Convert.ToBase64String(Encoding.ASCII.GetBytes(
      //    client.ClientCredentials.UserName.UserName + ":" + 
      //    client.ClientCredentials.UserName.Password)); 

      // OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = 
      //    httpRequestProperty; 


      // // client.ClientCredentials.SupportInteractive = true; 





      //using (OperationContextScope scope = new OperationContextScope(client.InnerChannel)) 
      //{ 

      // OperationContext.Current.OutgoingMessageHeaders.Add(
      //  new SecurityHeader("UsernameToken-49", client.ClientCredentials.UserName.UserName, client.ClientCredentials.UserName.Password)); 
       OperationResult result = new OperationResult(); 


       result = client.LoadDebitAmount(txtLoadAmountCust.Text, txtLoadAmountDep.Text, txtLoadAmountPlate.Text, txtLoadAmountFType.Text, txtLoadAmountFCode.Text, txtLoadAmountAmt.Text, txtLoadAmountInvNo.Text, txtLoadAmountInvDate.Text); 

       txtLoadAmountOut.Text = result.ReturnCode.ToString() + " " + result.ReturnMessage.ToString(); 
       // ServiceReference1.GlobalWeatherSoapClient soap = new ServiceReference1.GlobalWeatherSoapClient(); 

       //txtLoadQuantityOutText.Text= soap.GetWeather("Istanbul","Turkey"); 
       client.Close(); 
      //} 
      //} 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("Error: " + ex.Message); 

     } 
    } 
+0

Quelle langue côté client que vous souhaitez utiliser? js/jquery. S'il vous plaît partagez votre travail ... – Saadi

+0

Non J'utilise l'application de formulaire C# windows. –

+0

Mais vous avez mentionné la demande côté client. N'est-ce pas le côté serveur C#? – Saadi

Répondre

0

Vous pouvez utiliser l'attribut [MessageHeader] pour définir les en-têtes et des attributs [MessageBodyMember] pour définir le corps de votre message SOAP. Ajoutez YourClass comme argument dans votre définition de méthode de service WCF décorée avec [OperationContract]. Ensuite, dans votre client, appelez cette méthode avec YourClass comme argument.

[MessageContract(IsWrapped = false)] 
    public class YourClass 
    { 
     [MessageHeader] 
     public string HeaderName; 

     [MessageBodyMember(Order = 1)] 
     public string BodyVariable; 
    } 

Une autre façon d'ajouter des en-têtes de message:

En classe proxy:

MessageHeader<string> header = new MessageHeader<string>("YourHeaderValue"); 
    OperationContextScope contextScope = new OperationContextScope(InnerChannel);     
OperationContext.Current.OutgoingMessageHeaders.Add(header.GetUntypedHeader("String","System")); 

En classe Service:

OperationContext context = OperationContext.Current; 
var HeaderValue = context.IncomingMessageHeaders.GetHeader<string>("String", "System"); 
+0

ok après comment puis-je ajouter un message d'en-tête de savon? –

+0

Je recommande vraiment de créer une solution standard de Visual Studio WCF et d'essayer de le faire d'abord là. C'est un bon exemple de base d'utilisation des services WCF. – Nick

+0

Nick J'ai déjà un service web.Mais j'écris un projet côté client pour tester. Normalement j'utilise soapui.Mais j'écris un outil de test.Alors je dois envoyer webservice cette requête côté client. –