WCF安全認証:SoapHeaderは(b)は、HTTPリクエストを使用して呼び出します

WCF安全認証:SoapHeaderは(b)は、HTTPリクエストを使用して呼び出します


SOAPHeader配信要求、およびライブラリClientHeader書かれた他の製造すべき、との設定に対応する構成に追加する必要があります最初の記事WinFromクライアントプログラムのプレゼンテーションのフロントエンドでは、手順が複雑なようです。実際には、時には希望はデータを交換するためにWebRequestクラスのネイティブフォーマットコンビネーションソープ独自のデータです。

あなたが最初のWSDL仕様により、データの規則のいくつかを知っておく必要があります開始する前に見つけることができるのSOAPActionを

SOAPAction

上記でSOAPHeaderオブジェクトが含まれて、石鹸を組み合わせプログラムストリングソールに今ある標準データフォーマットを、供給された参照、フィドラー観測データを用いた処理を説明し、呼び出されるメソッドのパラメータが渡されます。

request_1

   1:  
 
 
   2:  
 
 
   3:      
 
 
  
  アカウント
 
 
   4:      
 
 
  
  パスワード
 
 
   5:    
   6:    
 
 
   7:      
 
 
   8:        
 
 
  
  テスト
 
 
   9:      
  10:    
  11:  

SOAPACTIONソープフォーマットとデータでは、次の3つの方法が記述するためのプラットフォームを使用します。

1.ネットがで呼び出されました

   1:文字列wsdlUri = "HTTP://ケビン-H:905 / basicHttpSoapHeader.host / MyProducts.svc singleWsdl"。
   。2:文字列名= System.Configuration.ConfigurationManager.AppSettings [ "ユーザ名"]のToString();
   3:文字列PWD =のSystem.Configuration.ConfigurationManager.AppSettings [ "PWD"]のToString();
   4:   
   5:プライベート無効btnCallSaySomething_Click(オブジェクト送信者、EventArgsの電子){
   6:{みてください
   7:HttpWebRequestのWebRequestクラス=(HttpWebRequestの)WebRequest.Create(wsdlUri)。
   8:webRequest.Method = "POST";
   9:webRequest.ContentType = "text / xmlで;のcharset = UTF-8";
  10:webRequest.Headers.Add( "のSOAPAction:" http://tempuri.org/IProductService/SaySomething "")。// < - のSOAPAction别忘了
  11:StringBuilderのsoapStr =新規のStringBuilder(Environment.NewLine)。
  12:soapStr.Append(」
 
 
  
  「+ Environment.NewLine)。
 
 
  13:soapStr.Append(」  
 
 
  
  「+ Environment.NewLine)。
 
 
  14:soapStr.Append(」    
 
 
  
  "+ユーザ名+"
 
 「+ Environment.NewLine)。
  15:soapStr.Append(」    
 
 
  
  "+ PWD +"
 
 「+ Environment.NewLine)。
  16:soapStr.Append(」 "+ Environment.NewLine)。
  17:soapStr.Append(」  
 
 
  
  「+ Environment.NewLine)。
 
 
  18:soapStr.Append(」    
 
 
  
  「+ Environment.NewLine)。
 
 
  19:soapStr.Append(」      
 
 
  
  テスト
 
 「+ Environment.NewLine)。
  20:soapStr.Append(」 "+ Environment.NewLine)。
  21:soapStr.Append(」 "+ Environment.NewLine)。
  22:soapStr.Append( "" + Environment.NewLine)。
  23:   
  24:バイト[]バッファ= Encoding.UTF8.GetBytes(soapStr.ToString())。
  25:webRequest.ContentLength = buffer.Length。
  26:ストリームポスト= webRequest.GetRequestStream()。
  27:post.Write(バッファ、0、buffer.Length)。
  28:post.Close();
  29:   
  30:HttpWebResponseの応答。
  31:応答=(HttpWebResponseの)webRequest.GetResponse();
  32:ストリームrespostData = response.GetResponseStream()。
  33:のStreamReaderのSR =新しいStreamReaderを(respostData)。
  34:文字列strResponseXml = sr.ReadToEnd()。
  35:   
  36:txtOutputValue.Text = strResponseXml。
  37:}キャッチ(例外ER){
  38:もし(!er.InnerException = NULL){
  39:txtSaySomethingMsg.Text = "のInnerException:" + er.InnerException.Message。
  40:}他{
  41:txtSaySomethingMsg.Text = "例外:" + er.Message。
  42:}
  43:}
  44:}

プログラムの実装の上記の結果はXML形式で、以下のデータを得た後、限り、このデータを解析して、あなたが望む結果を得ることができます。

   1:  
 
 
   2:  
 
 
   3:      
 
 
   4:          
 
 
  
  あなたは[テスト]と言います。
 
 
   5:      
   6:  
   7:  

2. Javaがで呼び出されました

   1:パッケージwcf.com。
   2:   
   3:輸入java.io.BufferedReader;
   4:インポートjava.io.ByteArrayOutputStreamを。
   5:輸入java.io.InputStreamReader。
   6:インポートにjava.io.OutputStream。
   7:輸入java.net.HttpURLConnectionの。
   8:インポートのjava.net.URL。
   9:輸入java.net.URLConnection。
  10:   
  11:パブリッククラスwcfClient {
  12:公共の静的な無効メイン(文字列[] args){
  13:文字列responseString = "";
  14:文字列outputString = "";
  15:文字列wsURL = "HTTP://ケビン-H:905 / basicHttpSoapHeader.host / MyProducts.svc WSDL"。
  16:   
  17:{みてください
  18:URLのURL =新しいURL(wsURL)。
  19:URLConnectionの接続= url.openConnection()。
  20:HttpURLConnectionのhttpConn =(HttpURLConnectionの)接続。
  21:ByteArrayOutputStream試合=新しいByteArrayOutputStream();
  22:              
  23:StringBuilderのxmlInput =新規のStringBuilder();
  24:xmlInput.append(」
 
 
  
  N ");
 
 
  25:xmlInput.append(」  
 
 
  
  N ");
 
 
  26:xmlInput.append(」    
 
 
  
  testman
 
 N ");
  27:xmlInput.append(」    
 
 
  
  A123456
 
 N ");
  28:xmlInput.append( "N");
  29:xmlInput.append(」  
 
 
  
  N ");
 
 
  30:xmlInput.append(」    
 
 
  
  N ");
 
 
  31:xmlInput.append(」      
 
 
  
  テキストテスト
 
 N ");
  32:xmlInput.append( "N");
  33:xmlInput.append( "N");
  34:xmlInput.append( "N");
  35:              
  36:バイト[]バッファ=新しい文字列(xmlInput).getBytes();
  37:bout.write(バッファ)
  38:バイト[] B = bout.toByteArray()。
  39:文字列のSOAPAction = "http://tempuri.org/IProductService/SaySomething"。
  40:              
  41:のHttp //は適切なパラメータを設定します
  42:httpConn.setRequestProperty( "のContent-Length"、String.valueOf(てb.length));
  43:httpConn.setRequestProperty( "のContent-Type"、 "text / xmlで、文字セット= UTF-8");
  44:httpConn.setRequestProperty( "のSOAPAction" のSOAPAction)。
  45:httpConn.setRequestMethod( "POST")。
  46:httpConn.setDoOutput(真)。
  47:httpConn.setDoInput(真)。
  48:)(= httpConn.getOutputStreamうちのOutputStream。
  49:out.write(b)は、
  50:out.close();
  51:   
  52:InputStreamReaderのISR =新しいInputStreamReaderの(httpConn.getInputStream())。
  53:=新しいBufferedReaderの(ISR)でBufferedReaderの。
  54:           
  55:一方(!(responseString = in.readLine())= NULL){
  56:outputString = outputString + responseString。
  57:}
  58:   
  59:              
  60:のSystem.out.println(outputString)。
  61:}キャッチ(例外ER){
  62:er.printStackTrace();
  63:}
  64:}
  65:}

同じ結果を実行した後.NETが自己を得た前の出力の結果はXMLを解析します取っていることがわかります。

PS。日食コンを使用する場合は、背中と右のデータに取るために要求を送信し、その値は、中国の障害に変更された後、後に渡されます。直感は、あなたがUTF-8中国の問題として保存されたファイルを変更した場合、アーカイブファイルは、渡さ解決されたときにウィンドウに長い時間のためだけ見つけるために、Eclipseのデフォルトのファイル形式は、エンコードされたMS950を確認し、コーディングの問題です。

3.アンドロイドがで呼び出されました

最も人気のあるモバイルデバイスは、当然のことながら、WCFジョブを呼び出すことができなければなりません、次のようなモデルは、例えば、Android上で4.2.2バージョンをベースにしています。

アンドロイド3.0の後、直接そうしないと、NetworkOnMainThreadExceptionのエラーメッセージが表示されます、メインスレッド上での活動をネットワーク化することはできません。そこでここでは、ファーストクラスのSoapObjecを作成し、別のスレッドにメインスレッド上で実行します。

SoapObject.java

   1:パッケージcom.example.callwcftest。
   2:   
   3:インポートにjava.io.IOException;
   4:   
   5:輸入org.apache.http.HttpEntity。
   6:輸入org.apache.http.HttpResponse。
   7:輸入org.apache.http.client.ClientProtocolException。
   8:輸入org.apache.http.client.ResponseHandler。
   9:輸入org.apache.http.client.methods.HttpPost。
  10:輸入org.apache.http.entity.ByteArrayEntity。
  11:輸入org.apache.http.impl.client.DefaultHttpClient。
  12:輸入org.apache.http.params.HttpConnectionParams。
  13:インポートorg.apache.http.params.HttpParams。
  14:輸入org.apache.http.params.HttpProtocolParams。
  15:輸入org.apache.http.util.EntityUtils。
  16:   
  17:インポートandroid.util.Log。
  18:   
  19:パブリッククラスSoapObject {
  20:プライベート文字列wsURL = "";
  21:プライベート文字列のsoapAction = "";
  22:プライベート文字列たSOAPBody = "";
  23:      
  24:公共ボイドsetWsURL(文字列wsURL){
  25:this.wsURL = wsURL。
  26:}
  27:      
  28:公共ボイドsetSoapAction(文字列のsoapAction){
  29:this.soapAction =のsoapAction。
  30:}
  31:      
  32:公共ボイドsetSoapBody(文字列たSOAPBody){
  33:this.soapBody =たSOAPBody。
  34:}
  35:   
  36:パブリック文字列のsendRequest(){
  37:文字列responseString = "";
  38:最終DefaultHttpClientのHttpClient =新しいDefaultHttpClient()。
  39://リクエストパラメータ
  40:HttpParamsのparams = httpClient.getParams()。
  41:HttpConnectionParams.setConnectionTimeout(paramsは、10000)。
  42:HttpConnectionParams.setSoTimeout(paramsは、15000)。
  43://設定パラメータ
  44:HttpProtocolParams.setUseExpectContinue(httpClient.getParams()、TRUE)。
  45:   
  46:// POSTエンベロープ
  47:HttpPost httppost =新しいHttpPost(this.wsURL)。
  48://は、ヘッダを追加
  49:httppost.setHeader( "SOAPアクション"、this.soapAction)。
  50:httppost.setHeader( "のContent-Type"、 "text / xmlで、文字セット= UTF-8");
  51:            
  52:{みてください
  53://エンティティは、要求を保持しています
  54:// HttpEntityエンティティ=新しいStringEntity(エンベロープ);
  55:HttpEntityエンティティ=新しいByteArrayEntity(this.soapBody.getBytes( "UTF-8"));
  56:httppost.setEntity(エンティティ)
  57:   
  58://レスポンスハンドラ
  59:するResponseHandler
 
 
  
   RH =新しいするResponseHandler
  
  
   
   (){
  
  
 
 
  60://クライアントが応答を受信したときに呼び出さ
  61:パブリック文字列のhandleResponse(のHttpResponse応答)
  62:ClientProtocolException、IOExceptionが{スロー
  63://レスポンスエンティティを取得
  64:HttpEntityエンティティ= response.getEntity()。
  65:   
  66://バイト配列として応答を読みます
  67:StringBufferのアウト=新しいStringBufferを();
  68:バイト[] B = EntityUtils.toByteArray(エンティティ)
  69:   
  70://文字列バッファへの応答バイト配列を書き込みます
  71:out.append(新しい文字列(B、0、てb.length))。
  72:out.toString()を返します。
  73:}
  74:}。
  75:   
  76:responseString = httpClient.execute(httppost、RH)。
  77:}キャッチ(例外e){
  78:Log.v( "例外"、e.toString())。
  79:}
  80:   
  81://接続を閉じます
  82:httpClient.getConnectionManager()シャットダウン();
  83:          
  84:responseStringを返します。
  85:}
  86:}

そして、メインスレッドのセクションを構成します

   1:パッケージcom.example.callwcftest。
   2:   
   3:輸入android.app.Activity。
   4:インポートandroid.os.Bundle。
   5:インポートandroid.util.Log。
   6:輸入android.view.Menu。
   7:輸入android.view.View。
   8:インポートandroid.widget.Button。
   9:輸入android.widget.TextView。
  10:   
  11:パブリッククラスMainActivityは{アクティビティを拡張
  12:   
  13:ボタンbtnCallWcf。
  14:TextViewのtxtMsg。
  15:@Override
  16:保護されたボイドのonCreate(バンドルsavedInstanceState){
  17:super.onCreate(savedInstanceState)。
  18:setContentView(R.layout.activity_main)。
  19:          
  20:btnCallWcf =(ボタン)this.findViewById(R.id.btnCallWcf)。
  21:txtMsg =(のTextView)this.findViewById(R.id.txtMsg)。
  22:          
  23:btnCallWcf.setOnClickListener(WcfCall)。
  24:}
  25:      
  26:プライベートButton.OnClickListener WcfCall =新しいButton.OnClickListener(){
  27:   
  28:@Override
  29:公共のボイドのonClick(表示arg0に){
  30:runOnUiThread(新しいRunnableを(){
  31:@Override
  32:公共ボイドラン(){
  33:{みてください
  34:文字列wsURL = "http://xxx.xxx.xxx.xxx:905/basicHttpSoapHeader.host/MyProducts.svc?singleWsdl"。
  35:文字列のsoapAction = "http://tempuri.org/IProductService/SaySomething"。
  36:のStringBuilderたSOAPBody =新規のStringBuilder();
  37:soapBody.append(」
 
 
  
  N ");
 
 
  38:soapBody.append(」  
 
 
  
  N ");
 
 
  39:soapBody.append(」    
 
 
  
  testman
 
 N ");
  40:soapBody.append(」    
 
 
  
  A123456
 
 N ");
  41:soapBody.append( "N");
  42:soapBody.append(」  
 
 
  
  N ");
 
 
  43:soapBody.append(」    
 
 
  
  N ");
 
 
  44:soapBody.append(」      
 
 
  
  中国&#038;英語のテスト
 
 N ");
  45:soapBody.append( "N");
  46:soapBody.append( "N"); 
  47:soapBody.append( "N");
  48:                          
  49:SoapObjectクライアント=新しいSoapObject();
  50:client.setWsURL(wsURL)。
  51 client.setSoapAction(のsoapAction)。
  52 client.setSoapBody(soapBody.toString())。
  53:                          
  54:txtMsg.setText(client.sendRequest())。
  55:Log.v(。 "成功"、txtMsg.getText()のtoString());
  56:}キャッチ(例外ER){
  57:Log.d( "MAIN ERR"、er.getMessage())。
  58:}
  59:                      
  60:}
  61:});
  62:              
  63:}
  64:          
  65:}。
  66:   
  67:}

結果の実装

android_2

これらのプラクティスでは、我々は事態多くに対処することができるはずです。

オリジナル:ビッグボックス  WCFのセキュリティ認証:SoapHeaderは(b)は、HTTPリクエストを使用して呼び出します


おすすめ

転載: www.cnblogs.com/petewell/p/11516574.html