2017-08-16 15 views
1

XMLでWebServiceと通信する必要があります。このサービスは、saml:アサーションを使用して接続を認証しています。私はサーバーと通信することができますが、検証は常に失敗します。私は何時間も問題を探しました。なぜなら、まったく同じパラメータとsamlチケットでsoapUIを使用すると、それが機能するからです。私は "手動で" saml:Assertionから書式を取り除こうとしましたが、これは署名されているため、1バイトの変更でもう動作しません。XmlElement.InnerXmlの書式設定なしでの使用方法

は、ここに私のコードです:

// Insert saml:Assertion string into soapenv:Header 
private static void InsertSAML(ref XmlDocument soapXML, ref XmlNamespaceManager nsmgr, string saml) 
{ 
    // Remove all formatting 
    saml = saml.Replace("\r", ""); 
    saml = saml.Replace("\n", ""); 
    while(saml.IndexOf(" ") > -1) 
    { 
     saml = saml.Replace(" ", " "); 
    } 
    saml = saml.Replace("> <", "><"); 
    saml = saml.Replace("\" />", "\"/>"); 

    XmlElement soapHeader = (XmlElement)soapXML.SelectSingleNode("//soapenv:Envelope/soapenv:Header/wsse:Security", nsmgr); 
    if (soapHeader == null) 
    { 
     throw new Exception("Can't find \"//soapenv:Envelope/soapenv:Header/wsse:Security\""); 
    } 

    soapHeader.InnerXml += saml; 
} 

しかし、それは、私はそれがフォーマットのいくつかの種類が発生しsoapHeader.InnerXml += saml;を使用するときのように思えます。空白は、内部コンテンツなしで要素の終了タグの前に表示されます。

だから、私はこれを追加する必要があります:

<dsig:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/> 

をしかし、最終的なXMLに私は挿入する前に、これらの出現箇所を交換した場合でも、このようになります。 :

<dsig:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" /> 

この現象を取り除くにはどうすればよいですか?

+0

なぜこの形式は失敗していると仮定していますか? wiresharkやfiddlerのようなスニファを使って、soapUIのレスポンスとアプリケーションのレスポンスを比較してください。あなたはアプリケーションをsoapUIのように見せます。最初のリクエストを比較し、C#コードを変更して開始し、ヘッダーがsoapUIと同じになるようにします。 – jdweng

+0

これは書式設定でなければなりません。 soapUIと私のC#コードのリクエストは、単一のタグを閉じる(/>)前のスペースを除いて全く同じヘッダとボディを持っています。 –

+0

ヘッダーと本文が同じ場合、何を書式設定と呼んでいますか?最初の応答は同じですか?どちらもhttp 1.0を使用していますか?あなたは200のステータスを取得していますか?私は、データがまったく同じであればタイミング問題になると思うでしょう。 httpはトランスポート層としてtcpを使用しており、tcp切断が可能です。私はそうは思わない。同時に2つの接続を同時に開いているように、サーバーは2番目の接続を許可していません。 – jdweng

答えて

0

私が言ったように、問題はInnerXmlにコンテンツを追加するときに追加のバイトXmlDocumentが私のxmlに追加されたことです。私はすべての書式を取り除くために非常に努力しました。それは良い方向でした。しかし、saml:Assertionの部分を "un-formatting"するのではなく、リクエスト本体全体を、サービスに送る直前にフォーマット解除することを決めました。そして今、それは動作します。

// Insert XML to request body 
private static void InsertSoapEnvelopeIntoWebRequest(XmlDocument soapEnvelopeXml, HttpWebRequest webRequest) 
{ 
    using (var stringWriter = new StringWriter()) 
    using (var xmlTextWriter = XmlWriter.Create(stringWriter)) 
    using (Stream stream = webRequest.GetRequestStream()) 
    { 
     // Get XML contents as string 
     soapEnvelopeXml.WriteTo(xmlTextWriter); 
     xmlTextWriter.Flush(); 
     string str = stringWriter.GetStringBuilder().ToString(); 

     // Remove all formatting 
     str = str.Replace("\r", ""); 
     str = str.Replace("\n", ""); 
     while (str.IndexOf(" ") > -1) 
     { 
      str = str.Replace(" ", " "); 
     } 
     str = str.Replace("> <", "><"); 
     str = str.Replace("\" />", "\"/>"); 

     // Write the unbeutified text to the request stream 
     MemoryStream ms = new MemoryStream(UTF8Encoding.Default.GetBytes(str)); 
     ms.WriteTo(stream); 
    } 
} 
関連する問題