1

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=trueto IsWrapped=falseinの検索/置換を行いまし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>
...

ですから、この時点で、私は完全に迷子になっています。任意の洞察をいただければ幸いです。私が提供できる他の情報があれば、私に知らせてください。

4

1 に答える 1

2

可能ではありますが、通常の解決策は、それが「単なる別のデータソース」であると想定し、代わりにサーバー側のWeb参照を使用してデータを提供する(そして将来の変更に対する絶縁を提供する)ことです。

Silverlight App <=> Silverlight Web Services <= External/Legacy Web Service

Silverlightアプリをスリムに保ち、サーバーに手間のかかる作業を任せます。

于 2012-05-10T09:40:51.603 に答える