Silverlight 5アプリケーションでSOAPサービスを利用しようとしていますが、完全に迷子になっています。これは私の最初のSilverlightアプリであり、.NETアプリケーションでWebサービスを使用するのは2回目です。
別の.NETアプリケーションで、それを機能させることができた唯一の方法は、WSDLをWeb参照として追加することでした。サービスリファレンスとして追加したときに、アプリケーションがビルドされませんでした。WSDLプロバイダーと話していると、WSDLが.NET 2.0フレームワークを使用してコンパイルされていることがわかりました。したがって、WSDLをWeb参照として追加する必要があります。
これまでに行った調査から、SilverlightはWeb参照の追加をサポートしていないことがわかります。そこで、ホスティングASP.NETアプリケーションにWeb参照として追加して、サーバーを起動してみました。
Silverlightアプリに戻り、サービス参照を追加するオプションを選択し、WSDLファイルをポイントしましたhttp://localhost:55265/Web%20References/THINKWebService/SLWebSvc_734_Upgrade.wsdl
。Visual Studioはそれをうまく拾い上げ、プロキシを生成するようでした。
これが私が行き詰まり始めるところです。私の調査が正しければ、WCF参照が作成されたので、そのように使用する必要があります。私はWCFを使用したことがないので、リクエストの送受信方法を読みました。これは、MSDNライブラリの例に基づいて思いついた最高のコードです(ボタンクリックイベントに挿入したので、コードがいつ実行されたかを正確に知る):
private void Button1Click(object sender, RoutedEventArgs e)
{
var client = new ThinkSoapClient();
var userLoginData = new user_login_data {login = "foo", password = "bar"};
var customerIdentifier = new customer_identifier {customer_id = 6677070};
// the debugger halts on this next line and
// references the "dsn"...it's the 4th argument
client.CustomerLoginInfoSelectAsync(userLoginData, customerIdentifier, "", "myDSN");
// I'm not sure if this next line is even needed
client.CustomerLoginInfoSelectCompleted += CustomerLoginInfoSelectCallback;
MessageBox.Show(string.Format("CustomerLoginInfoSelectAsync({0},{1})", userLoginData, customerIdentifier));
}
// here's the callback method
static void CustomerLoginInfoSelectCallback(object sender, CustomerLoginInfoSelectCompletedEventArgs e)
{
MessageBox.Show(string.Format("CustomerLoginInfoSelect Result: {0}", e.Result));
}
上記のコードで述べたように、client.CustomerLoginInfoSelectAsync
メソッドを実行するとデバッガーが停止します。エラーメッセージは次のとおりです。XmlSerializer attribute System.Xml.Serialization.XmlAttributeAttribute is not valid in dsn. Only XmlElement, XmlArray, XmlArrayItem and XmlAnyElement attributes are supported when IsWrapped is true.
私が行った調査から、このエラーは、SOAPアクション要素に属性が含まれているために発生していると思いますdsn
(ただし、サブ要素にも属性がある場合にこのエラーが発生するかどうかはわかりません)。
IsWrapped=true
to IsWrapped=false
inの検索/置換を行いましReference.cs
たが、同じエラーが発生しましたが、最後の単語がtrueではなくfalseでした。
自分が何を求めているのかわからないので、役立つ場合に備えて、生成されたXMLは次のようになります。
...
<customer_login_info_select_request dsn="myDSN">
<user_login_data>
<login>foo</login>
<password>bar</password>
</user_login_data>
<customer_identifier>
<customer_id>6677070</customer_id>
</customer_identifier>
<login/> <!--corresponds to the empty string in the call to CustomerLoginInfoSelectAsync-->
</customer_login_info_select_request>
...
ですから、この時点で、私は完全に迷子になっています。任意の洞察をいただければ幸いです。私が提供できる他の情報があれば、私に知らせてください。