2011-08-05 14 views
3

GetDataメソッドを公開する単純なwcfサービスを作成しました。実際には、新しいwcfプロジェクトを作成するときに作成されるテンプレートです。wcfサービス内部サーバーエラー

このように、私は、IISサーバーにアプリケーションを追加したので、外部からアクセスすることができます:http://192.168.0.100/TFSWrapper/Service1.svc

私はGetDataメソッドにリクエストを送信するために、一般的なSOAPクライアントを使用していました。

ここ
<?xml version="1.0" encoding="utf-16"?> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <soap:Body> 
    <GetData xmlns="http://tempuri.org/" /> 
    </soap:Body> 
</soap:Envelope> 

がSOAPレスポンスである:これは、生成されたSOAPリクエストである

<?xml version="1.0" encoding="utf-16"?> 
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Body> 
    <GetDataResponse xmlns="http://tempuri.org/"> 
     <GetDataResult>You entered: 87</GetDataResult> 
    </GetDataResponse> 
    </s:Body> 
</s:Envelope> 

ところで、私は、メソッドからパラメータを除去し、戻り値をハード。

ご覧のとおり、すべてが正常に動作します。

次に、同じサービスを呼び出すTitaniumクライアントを作成しました。私は上記のように正確な石鹸要求を使用しました。

は基本的に私はこれでした:これが送信される

var s='<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><GetData xmlns="http://tempuri.org/" /></soap:Body></soap:Envelope>'; 
     //xhr.send(config.envelopeBegin+body+config.envelopeEnd); 
     xhr.send(s); 

を、サーバーには、以下のフォルト文字列と一緒に「500内部サーバーエラー」応答を返している:

アクションとメッセージを EndpointDispatcherでContractFilterの不一致が原因で、 'http://tempuri.org/GetData'は受信者で処理された にはなりません。これは、契約不一致 (送信者と受信者の間の不一致のアクション)または送信者と受信者間のバインド/セキュリティの不一致( )が原因である可能性があります。送信者と 受信者が同じ契約と同じバインディング(メッセージ、転送、なしなどのセキュリティ要件を含む を含む)を持っていることを確認します。

最初にチタン石鹸apiを使用してリクエストXMLを作成しましたが、同じエラーが発生していました。私はそれがどのように作成されたのかという問題でしたが、その理由は私が要求(その作品)をハードコーディングしたものですが、まだ運がないのです。

+0

こんにちは!私はあなたの質問に答えるのを助けることができるように、もう少し情報を提供できますか?特に:どのバージョンのTitanium Mobile SDKを使用していますか?どのバージョンのiOSシミュレータまたはAndroidエミュレータをテストしていますか?数日後にも、そのテストサーバーにはまだ攻撃できますか?私はあなたが作業コードを手に入れるのを手伝ったり、バグを報告してトラックにあなたを止めさせる根本的な問題を修正したりします。後で! –

答えて

2

デフォルトでは、WCFサービスのOperationContractsは、HTTP POSTを使用してのみ呼び出すことができます。 Titanium HTTPClientでopen()を呼び出すときに、HTTPメソッドパラメータとしてGETまたはPOSTを指定していますか?

第2に、サービスバインディングがSOAP 1.1を使用しているため、WCFがメッセージをGetDataメソッドにルーティングできるようにSOAPActionヘッダーを要求に渡す必要があります。サービスのOperationContract属性にActionパラメータが指定されていない場合、アクションは名前空間とサービス契約名の前にあるメソッド名である必要があります(おそらくhttp://tempuri.org/IService1/GetData既定のWCFアプリケーションが作成されました)。また、コンテンツタイプを指定する必要があります。また

xhr.setRequestHeader('Content-Type', 'text/xml; charset=utf-16'); 
xhr.setRequestHeader('SOAPAction', '"http://tempuri.org/IService1/GetData"'); 
xhr.send(s); 

は、あなたが明示的にWCFサービス操作のためのアクションを指定することができます:

[OperationContract(Action = "MyAction")] 
string GetData() 
{ 
    // ...snip... 
} 

xhr.setRequestHeader('SOAPAction', '"MyAction"'); 

をそして最後に、あなたができるよう、あなたが送って呼び出すには、この前のような設定にごXHRを必要とするだろう[WebGet]属性でメソッドを修飾することで、HTTP GETを介してサービス操作を呼び出すことができます。これにより、操作をREST形式で呼び出すことができます。http://msdn.microsoft.com/en-us/library/system.servicemodel.web.webgetattribute.aspx