2010-12-28 19 views

答えて

0

私が考えることができる唯一の理由は契約の不一致です。検証エラーがスローされない場合は奇妙ですが。正しいWSDLから生成されたクライアントを使用していますか?それはWCFクライアントかSOAPですか?前者は検証を行いますが、スキーマの不一致が後者をスリップする可能性があります。

+0

これは、wsdlツールからプロキシクラスを生成し、VS2010 GUIを使用してプロキシクラスをサービス参照として追加するときに発生します。これはSOAPクライアントです。 – Sean

+0

wsdl.exeではなくsvcutil.exeを使用してください。または、「サービス参照の追加」を使用して、WSDLまたはメタデータのエンドポイントをポイントするだけです。 –

+0

私はこれとまったく同じ問題を抱えています.WSDLに見られる名前空間と(Fiddlerでの)XML応答はまったく同じです。応答オブジェクトは、@XmlElementRefs({@ XmlElementRef(type = Class1.class、...})でアノテーションされている(Javaの)サーバーサイドの汎用配列を渡す単純なラッパーです。 C#クライアントは次のようにうまく見えます。 ... ... ....。C#は応答オブジェクトを作成しますが、配列の作成に失敗しました。 – earcam

4

「レスポンスがnullです」または「レスポンスにnullが含まれています」または「リクエストがnullです」または「リクエストにnullが含まれています」とは、ほとんどの場合、名前空間の不一致を意味します。例えば、応答は、含まれていてもよい:この場合

<response xmlns="http://bar.com"/> 

<response xmlns="http://foo.com"/> 

を実際にあるべきで、NULLが受信されます。

+0

YES ! – mikey

0

これが私に起こるたびに、サービス参照を更新する必要があるからです。それを試して、何が起こるか教えてください:)

+0

レスポンスありがとう、私を信じて、私は約1000回=削除して再作成しました=( しかし、それは同じように単純な何かを欠いているか、どこか他の愚かな間違いを犯している可能性が高いです(私の最初のC#アプリ) 私はVS 2010とSharpDevelopを試してみましたが、無用です。 – earcam

+0

あなたが尋ねてきたので、あなたはもう一度それをやることができるかどうか質問してください。私。削除して再作成するのではなく、サービス参照を更新します。それがうまくいかないとすれば、オブジェクトとメソッドの定義/コントラクトを見るのが理想的でしょう:) –

+0

SharpDevelopでリフレッシュしました。以前と同じでした。 VS Express 2010でWebService Referenceをリフレッシュしたときに、プロジェクトのデフォルト名前空間の先頭にC#名前空間が追加されました(DefaultNamespace.ServiceReferenceなど)。いずれかのIDEから実行すると、nullフィールドを持つ同じレスポンスオブジェクトになります。 – earcam

0

解決済み...または少なくとも回避策があります。 Javaコードでは、@XmlElementRefsと@XmlElementRefはそれぞれ@XmlElementsと@XmlElementでなければなりません( "type"属性と同様に "name"属性も必要です)。

私はこれをJavaタグとC#とWebサービスで新しい質問として投稿したのでしょうか、いくつかの厄介なstackoverflowerがこの子どものエラーを発見したはずです。

0

私はReference.csのOrder値をチェックして解決した同様の問題がありました。

リターンパラメータの順序は変更されましたが、Visual Studioでサービス参照を更新しても「Order」値は変更されませんでした。

Fiddler/SoapUIで返されるパラメータが、プロキシ生成されたクラスと同じであることを確認してください。

0

VSからのSVCUTIL/Service Referenceでクライアントを作成したのと同じケースがありました。応答は正しいデータ(IClientMessageInspector.AfterReceiveReplyメソッドで確認済み)で正常に受信されましたが、オブジェクトレベルの値は入力されませんでした。

1)特定のオブジェクトを正確にその型として命名されたが、その種類は異なる名前空間を持っていた:(たSystem.Diagnosticsの出力を介して確認した)は、デシリアライズ・エラー

問題は二重だったがありませんでした。これは、プロキシジェネレータがオブジェクトの1つにクラスのnamespaceパラメータ(System.Xml.Serialization.XmlElementAttribute注釈)を割り当てるのを混乱させたようです。

2)注文パラメータ(System.Xml。プロパティのSerialization.XmlElementAttribute注釈)が必要ではないし、また、名前空間パラメータからそう

が欠落したと[System.Xml.Serialization.XmlElementAttribute(ISNULLABLE =真、オーダー= 0)]

:[ System.Xml.Serialization.XmlElementAttribute(IsNullable = true、Namespace = "http://www.whathevernamespaceiscorrect。com ")]

基本的に、生成されたプロキシでは、クラスの名前空間を型に指定された名前空間に修正し、orderパラメータをnamespaceパラメータに置き換えて正しい名前空間に設定する必要がありましたWSDL

1

私は同じ問題を抱えていたし、名前空間の問題は根cause.Howeverことを示唆したように、私のプロキシクラスは、クラスやネストされた名前空間の長鎖を入れ子にしている。

それが正しい名前空間を識別するために混乱してここでは、クライアントプロキシで更新が必要な名前空間を理解する方法を説明します。

ClientMessageInspectorクラスのAfterReceiveReplyメソッドでリクエストをインターセプトしたのは、応答メッセージを受信した後で、クライアントアプリケーションに戻す前にメッセージの検査または変更を有効にしたことです。 XMLDocumentを使用してResponseでnullを返します。 XMLから取得した名前空間でプロキシクラスを更新しました。変更を加えた後、オブジェクトは応答としてnullではありませんでした。

public class MyMessageInspector : IClientMessageInspector 
{ 
    public void AfterReceiveReply(ref System.ServiceModel.Channels.Message request, object correlationState) 
    { 

     MemoryStream ms = new MemoryStream(); 
     XmlWriter writer = XmlWriter.Create(ms); 
     request.WriteMessage(writer); 

     writer.Flush(); 
     ms.Position = 0; 
     XmlDocument xmlDoc = new XmlDocument(); 
     xmlDoc.Load(ms); 
     this.ReadMessage(xmlDoc); 


     ms = new MemoryStream(); 
     xmlDoc.Save(ms); 
     ms.Position = 0; 
     XmlReader reader = XmlReader.Create(ms); 
     Message newMessage = Message.CreateMessage(reader, int.MaxValue, request.Version); 
     newMessage.Properties.CopyProperties(request.Properties); 
     request = newMessage; 

    } 

    private void ReadMessage(XmlDocument xmlDoc) 
    { 
     XmlNode v1 = xmlDoc.GetElementsByTagName("XPAth"); 
     //Actual Namespace in XML, which should be used in Proxy Class 
     string namespaceURIForObjectInXML = v1.NamespaceURI; 
    } 

    public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel) 
    { 

    } 



} 
0

出力と一致することを確認してください。 WSDL(ブラウザ)とレスポンス(SOAP-UI、Fiddler)を比較する。

  • WSDLは、キャメルケース(lastNameの)を使用し、
  • 応答がアンダー(姓)を使用します。
関連する問題