2015-10-01 14 views
19

PHPからWCFサービス(.NET)を呼び出そうとしています。サービスでWS2007FederationHttpBindingを使用して認証するため、SoapClientを使用するよりも少し複雑です。PHP(連合セキュリティ付き)でWCFサービスを呼び出す

ここに私が使用しているコードがあります。私は信じられないほどの資格情報を追加していませんが、関係なく、私はアクセスが拒否された時点でさえもありません。 WSDLは、私が指している必要があり

$wsdl = "https://slc.centershift.com/sandbox40/StoreService.svc?wsdl"; 
$client = new SoapClient($wsdl,array(
     //'soap_version'=>SOAP_1_2 // default 1.1, but this gives 'Uncaught SoapFault exception: [HTTP] Error Fetching http headers' 
     )); 
$params = array(); 
$params['SiteID'] = 123; 
$params['GetPromoData'] = false; 

$ret = $client->GetSiteUnitData(array('GetSiteUnitData_Request'=>$params)); 
print_r($ret); 
  1. SOAP 1.2を指定する必要がありますか?私がすると、私は接続タイムアウト([HTTP] Error Fetching http headers)を取得します。私がそうしないと、SOAP 1.1のデフォルトが使用され、[HTTP] Cannot process the message because the content type 'text/xml; charset=utf-8' was not the expected type 'application/soap+xml; charset=utf-8'が得られます。私はまだ認証されていないか、間違ったSOAPバージョンを使用しているためですか?

  2. PHPでの認証方法は?対応する.NET/C#コードは次のとおりです。どういうわけかこれらをSOAPヘッダーとして入れる必要がありますか?私はそれをすべて間違って考えています。私はメソッドを呼び出す前に何らかの認証をする必要があります(私が読んだものから、トークンを取り戻し、それを将来のすべてのメソッド呼び出しに使用するはずです。

。私は an answer here on Stack Overflowでこれの例を参照してくださいだと思う私はWSDLのいずれかのSOAPバージョンのいずれかを使用して、 $client->__getFunctions()を呼び出す場合、私はすべての機能の有効なリストを取得していますので、私はこれらのいずれかであると仮定実際の問題は認証です。

私が話したことがある他のプログラマは、これを動作させるのに時間を費やしていましたが、あきらめて代わりに.Nのプロキシを実装しましたET。彼らはPHPから独自のセキュリティで保護されていない.NETサービスにパラメータを渡します。それは動作しますが、WCFの目的はすべてのタイプのクライアント(非HTTPでも可能です)をサポートすることですので、私にとってはうんざりして非効率的で、逆効果です。

私はHow to: Create a WSFederationHttpBindingをMSDNで読んだことがありますが、それは役に立ちませんでした。

+0

?wsdlまたは?singleWsdlのいずれかが問題ありません。前者は複数の文書を目的別に分割して参照していますが、後者はすべて1か所にまとめられています。 wsdlは使用されている石鹸のバージョンを指定していますので、wsdlをダウンロードした後に、使用する石鹸のバージョンを知らせる必要があります。この基本的な情報がwsdlに加えて提供される必要があるならば、私は図書館が未成熟/低品質であることを示唆しています。私は異なる/より良い石鹸ライブラリを見つけることをお勧めします。 – MattC

+0

@MattCコメントをいただきありがとうございます。 WSDLについて知っておきたいことですが、soapライブラリは問題ではありません(これはPHP固有のものです)。私はnuSoapをチェックアウトしましたが、何の利点もないように見えませんでした。 –

+0

私は本当にsnarky、@ ShaneNを鳴らしたくありませんが、PHPに組み込まれているのは品質の保証ではありません。例えば、厄介な 'mail()' PHPからSOAPで作業していないので、私は助けることはできません。 – Palec

答えて

0
  1. このURLは、WSDL https://slc.centershift.com/Sandbox40/StoreService.svc?singleWsdlに使用できます。このWSDLにはすべての定義があります。

  2. このWebサービスはSOAP 1.2バージョンで動作するため、1.2を使用する必要があります。 1.1と1.2で試してみましたが、どちらもエラーが発生しました。 1.1はバージョンエラー、1.2はタイムアウトエラーです。私はこのテストサーバーにエラーがあると思います。私はコードを生成するためにsvcutilで使用しましたが、エラーも発生しました。通常は、情報を取得し、サービスを呼び出すためのコード例を生成する必要があります。

  3. 通常、SoapHeaderで認証パラメータを追加したり、SoapClient consructのオプションに直接追加することができます(サービス認証が基本認証の場合)。あなたのスクリーンショットにしたがってコードの下に書きます。しかし、それは長い待ち時間の後にタイムアウトを与える。

    $wsdl = "https://slc.centershift.com/sandbox40/StoreService.svc?wsdl"; 
    $client = new SoapClient($wsdl,array('trace' => 1,'soap_version' => SOAP_1_2)); 
    
    $security = array(
    'UserName' => array(
        'UserName'=>'TestUser', 
        'Password'=>'TestPassword', 
        'SupportInteractive'=>false 
    ) 
    ); 
    
    $header = new SoapHeader('ChannelFactory','Credentials',$security, false); 
    $client->__setSoapHeaders($header); 
    
    
    
    $params = array(); 
    $params['SiteID'] = 100000000; 
    $params['Channel'] = 999; 
    try { 
        $ret = $client->GetSiteUnitData($params); 
        print_r($ret); 
    }catch(Exception $e){ 
        echo $e->getMessage(); 
    } 
    

    __getFunctionsは、WSDLで定義された関数を出力するため、機能します。最初の呼び出しでWSDL情報を取得することに問題はありません。しかし、本当の問題はコミュニケーションです。 PHPはWSDLを取得し、必要なSOAP要求を生成してサーバーに送信しますが、サーバーは正しく応答しません。 SOAPサーバーは、パラメーターまたは要求本体が正しくない場合でも、常に応答を出します。

    あなたはサービスプロバイダと通信する必要があります。私は彼らがあなたの質問に明確な答えを与えることができると思います。

+0

お返事ありがとうございました。残念ながら、サービスプロバイダーは助けを提供するつもりはありません。彼らは、彼らのサービスが.NETクライアントのために働いていると主張しているので、他のクライアントタイプでは動作していないことを調査する理由はありません。基本的に、彼らは私たちにMicrosoftスタックを使用させている。 –

0

SOAPコールがC#アプリケーションから動作する場合は、あなたが行われ、実際の要求を表示し、PHPから同様の要求を構築する(フィルタip.dst == 204.246.130.80で)Wiresharkを使用することができます。

this answerにチェックを入れて、カスタムSOAP呼び出しの実行方法を確認してください。

また、あなたのXMLボディを構築するのが簡単かもしれないので、生のcurlリクエストを行うオプションもありますが、あなたはsimplexmlで自分でレスポンスを解析する必要があります。

+0

私はそれを試みましたが、要求はすべてSSLで行われているため、メッセージのペイロードは暗号化されています。証明書を読み込んで解読できるようにする方法がありますが、試してみましたが、私のためにはうまくいきませんでした(自分の秘密鍵が必要でした)。 –

+0

httpで動作しない場合パケットを表示する最も簡単な方法は、接続のプロキシを設定し、[Fiddler](http://www.telerik.com/fiddler/web-traffic-recording)をプロキシとして使用して、データ。 – Catalin

1

.NETで期待される名前と一致するPHPのクラスからオブジェクトを作成する必要があると思われる前に、PHPから.NET WSを消費していた。 WSDLは、それが期待しているタイプを教えてくれるはずです。私はあなたの道を手助けしたいと思っています!

関連する問題