2016-08-14 10 views
6

データを取得するために3番目のサイドWebサービスクライアント(「サービス参照の追加」を使用して作成)を使用しています。オブジェクトを文字列 xmlにヘッダーでシリアル化する方法

適切なデータを使用してWebサービスオブジェクトを充填した後、我々は(暗号化されたパスワードと他のいくつかの定義済みのデータ)ヘッダにいくつかのデータを追加する必要が

その後、我々が使用して、Webサービスに送信されたすべての要求をシリアル化しています標準.net XmlSerializer

ただし、シリアル化の結果、リクエストのヘッダーが表示されません。私は長い間検索しており、それらを「印刷」する方法を見つけることができませんでした。ここで

は、いくつかのサンプルコードです:

Ibooking proxy = new BookingManager(); 

/* Init proxy Data...*/ 
GetAvailabilityRequest request = new GetAvailabilityRequest(); 

/*Fill more data on the request...*/ 
GetAvailabilityResponse response = proxy.GetAvailability(request); //Send request to the web service 
var xmlString2 = response.Serialize(); //only body, no headers in the XML 


/* Extension class to Serialize any object */ 
public static class ExtensionUtil 
{ 
    public static string Serialize<T>(this T value) 
    { 
     try 
     { 
      XmlSerializer xmlserializer = new XmlSerializer(typeof(T)); 
      var stringWriter = new StringWriter(); 
      using (var writer = XmlWriter.Create(stringWriter)) 
      { 
       xmlserializer.Serialize(writer, value); 
       return stringWriter.ToString(); 
      } 
     } 
     catch (Exception ex) 
     { 
      throw new Exception("An error occurred", ex); 
     } 
    } 
} 

私はそれは長くて複雑なので、要求に、より多くのデータを追加するコードを除外してきました(私たちの前IEndpointBehaviorIClientMessageInspectorに「キャッチ」要求を実装する必要がありますそれを送信する) - しかし、現時点では回避策として、私はメッセージオブジェクトにBreakPointを置き、Visual Studioを使用して文字列に変換します。このようにしてヘッダーが見えますが、シリアル化では自動化したいので、これは悪い習慣です。

+0

リクエストまたはレスポンスにヘッダーを表示しますか? – sachin

+0

リクエストはもっと重要ですが、結局私はそれらを両方ともシリアル化しています(リクエストとレスポンスXMLが作成されています)。私は両方のヘッダを見る機能を望みます – Dardar

+0

何が起こっているのか分かりません。しかし、XmlSerializerが迷惑メールであることがわかります。 NetDataContractSerializerを使用して、シリアル化されるクラスがDataContractでマークアップされ、シリアル化されるプロパティがDataMember属性でマークアップされていることを確認します。情報については – Will

答えて

0

これらのヘッダーを追加する方法の例をご覧ください。

ほとんどのWebサービスでは、メッセージ本文はXMLまたはJSONにシリアライズされた部分です。ヘッダーはそうではありません。

この記事で説明しているように、Fiddlerとweb.configの小さな変更によって実装されたプロキシを使用して、サービス呼び出しを検査することができます。http://weblog.west-wind.com/posts/2008/Mar/14/Debugging-Http-or-Web-Services-Calls-from-ASPNET-with-Fiddler

これのショートバージョンがあなたのweb.configファイルまたはapp.configをに以下を追加することです:

<system.net> 
     <defaultProxy> 
      <proxy proxyaddress="http://127.0.0.1:8888" />  
     </defaultProxy> 
    </system.net> 

ダウンロードおよびサービスの呼び出し中にフィドラーを実行し、あなたが見ると、コールを検査することができるはずですフィドラーで

コードベース内のヘッダーを検査および/または変更する場合は、IClientMessageInspectorまたはIDispatchMessageInspectorを実装することができます。ここで話題のカップルの記事です:

https://msdn.microsoft.com/en-us/library/system.servicemodel.dispatcher.iclientmessageinspector(v=vs.100).aspx http://weblogs.asp.net/paolopia/writing-a-wcf-message-inspector

は、ここで私がやった実装です。私はヘッダーにアクセスする必要はなく、サービスクライアントによって作成されたXML名前空間を変更する必要がありましたが、実装の仕方に関するアイデアが得られるはずです:How can I create custom XML namespace attributes when consuming a legacy SOAP service?

0

OperationContextはここにあなたの友人です。 OperationContextScopeを使用して呼び出しをサービスにラップし、次にOperationContext.Currentを使用して必要な隠しアイテムをすべて取得します。

https://msdn.microsoft.com/en-us/library/system.servicemodel.operationcontextscope(v=vs.110).aspx

あなたはで取得したいヘッダの特定のタイプを知る必要があります、と私はいくつかのトラブル値で取得を持っていた、というよりも、ヘッダーの名だけ、もしノートXmlSerializerを使用しているときにシリアル化可能とマークされていません

関連する問題