2012-03-22 6 views
0

SOAP Webサービスを使用してasp.netサーバーと通信するiosアプリケーションを作成しています。私のWebサービスの1つは、オブジェクトの配列を取る必要があります。オブジェクト定義は両側で全く同じです。iphone appのオブジェクト配列を.net SOAP webserviceにパラメータとして渡すことができません。

私が試したことは次のとおりです。パラメーターとして1つのオブジェクトだけを渡したとき、Webサービスはうまくいきました。しかし、オブジェクトの配列を渡すとすぐに、私は何も返されません。 Webサービス内のコードが決して呼び出されないということは、サーバーがパラメータを読み取ることができなかったことを意味します。有線のものは、Webサービスが何も返されなかったので何が間違っているのかを知ることができません(過去に何か間違ったことをしたときにスタックトレースを表示するサーバからエラーメッセージを受け取っていました)。

私はSOAP Webサービスに精通していないので、MSDNで多くの時間を費やしましたが、何が間違っているのかまだ分かりませんでした。 Webサービスを公開した後、私はブラウザからアクセスしました。私はすべてのものを私のiOSアプリにコピーしたので、理論上はうまくいくはずだが、それは決してしなかった。

とにかく、これは、サーバー側のコードです:

[System.Web.Services.Protocols.SoapRPCMethod] 
[WebMethod(EnableSession = true)] 
[XMLInclude(typeof(Team))] 
[XMLInclude(typeof(Team[]))] 
[SoapInclude(typeof(Team))] 
[SoapInclude(typeof(Team[]))] 
public string testTeamWebService(Team[] teams) 
{ 
    // do something here 
} 

// class definition of Team 
[Serializable] 
public class Team 
{ 
    public int TeamID; 
    public string TeamName; 
} 

は、Webサービスのページ(の.asmxファイル)によると、ここで私はそれを呼び出すために何をすべきかです:

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="https://abc.com/" xmlns:types="https://abc.com/encodedTypes" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
<soap:Body soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 

    <tns:testTeamWebService> 
     <teams href="#id1" /> 
    </tns:testTeamWebService> 

    <soapenc:Array id="id1" soapenc:arrayType="types:Team[2]"> 
     <Item href="#id2" /> 
     <Item href="#id3" /> 
    </soapenc:Array> 

    <types:Team id="id2" xsi:type="types:Team"> 
     <TeamID xsi:type="xsd:int">int</TeamID> 
     <TeamName xsi:type="xsd:string">string</TeamName> 
    </types:Team> 

    <types:Team id="id3" xsi:type="types:Team"> 
     <TeamID xsi:type="xsd:int">int</TeamID> 
     <TeamName xsi:type="xsd:string">string</TeamName> 
    </types:Team> 
</soap:Body> 
</soap:Envelope> 

として、私は言った、私はXMLを構築し、iOSで送信します。私はNSMutableURLRequestオブジェクトを使用し、構築されたXMLは上記の方法とまったく同じです。

私の他のWebサービスでは、サーバーからオブジェクト配列を取得するので、.netは配列をシリアル化できます。これは私のサービスがパラメータとして配列をとる必要があるのは初めてのことです。そのためには、その方法が必要であると思います。

あなたの読書をありがとうと私にできることならいくつかのアドバイスをお願いします。


私は最終的にサーバーからのエラーメッセージました:私は本当にあなたの問題を解決する方法を知っているが、ちょうどあなたができない場合には、それを取得する必要があり、取ることはありません

faultcode: soap:Server 
faultstring: System.Web.Services.Protocols.SoapException: Server was unable to process request.---> System.ArgumentException: Object of type 'System.Xml.XmlNode[]' cannot be converted to type 'abc.WebServices.Team[]'. 
at System.RuntimeType.CheckValue(Object value, Binder binder, CultureInfo culture, BindingFlags invokeAttr) 
at System.Reflection.MethodBase.CheckArguments(Object[] parameters, Binder binder, BindingFlags invokeAttr, CultureInfo culture, Signature sig) 
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks) 
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) 
at System.Web.Services.Protocols.LogicalMethodInfo.Invoke(Object target, Object[] values) 
at System.Web.Services.Protocols.WebServiceHandler.Invoke() 
--- End of inner exception stack trace --- 
detail: 

答えて

0

ここに私の問題の解決策があります。なぜ私のコードがうまく動かないのか分かりませんが、私が知っているのは、パラメータが.netサーバに渡されたときに、渡されたオブジェクトが何であるかを推測しようとしたときです。そして、何らかの形でカスタムクラスの配列が混乱してしまったとしても、Webメソッドの冒頭にカスタムクラスが定義され宣言されています。 < 1> xmlを文字列として渡し、サーバー側で手動で逆シリアル化します。 < 2>データセットをサーバーに渡します。 < 3>自分のクラスをXMLNodeとして定義し、それをサーバーに渡します。

どのような方法を選んでも、xmlを正しく直列化解除するための作業が必要です。

これを行う別の方法があります。

SOAPメッセージにRPC形式を使用した場合、サーバーが混乱しただけなので、別の形式はどうですか?私は下のコードを試して、ビンゴ、サーバーはすぐにそれを拾った。

[WebMethod] 
public string testTeamWebService(Team[] teams) 
{ 
    // do something here 
} 


// class definition of Team 
[Serializable] 
public class Team 
{ 
    public int TeamID; 
    public string TeamName; 
} 

、その後、XML要求は、この方法でフォーマットされています

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
<soap:Body> 
<testTeamWebService xmlns="http://tempuri.org/"> 
    <teams> 
    <Team> 
     <TeamID>int</TeamID> 
     <TeamName>string</TeamName> 
    </Team> 
    <Team> 
     <TeamID>int</TeamID> 
     <TeamName>string</TeamName> 
    </Team> 
    </teams> 
</testTeamWebService> 

ここで私は特別に感謝ピーターパイをしたい - この問題で私を助けるため、マイクロソフトからMSFTとここにありますasp.netのリンク:

http://forums.asp.net/t/1784291.aspx/1?asp+net+SOAP+RPC+web+method+could+not+read+object+array+parameter

私の投稿が同じ問題を抱えている人に役立つことを願っています。

+0

配列の型がstringの場合、どうすればよいですか?このような? team1 team2 Skychan

+0

更新:上記は私のために完全に働きました – Skychan

1

http://sudzc.com/をご覧ください。このコードは、あなたの要求を客観的に行うために必要なすべてのコードを生成します。 私はそれを使っていましたが、配列を送信するときにいくつかの問題がありましたが(私はそれらを解決しました)this way

+0

ご返信いただきありがとうございます。私が今やっているWebサービスは、私たちのローカルテストサーバー上にあるので、プロダクションに公開する必要があります。私はそれを試してみましょう。ありがとう。 –

関連する問題