在Silverlight中使用SOAP Web服务

时间:2012-05-09 21:03:23

标签: silverlight .net-4.0 wcf-client silverlight-5.0

我试图在Silverlight 5应用程序中使用SOAP服务,但我完全丢失了。这是我的第一个Silverlight应用程序,也是我第二次在.NET应用程序中使用Web服务。

在一个单独的.NET应用程序中,我能够让它工作的唯一方法是将WSDL添加为Web引用;当我将其添加为服务引用时,应用程序将无法构建。在与WSDL提供者交谈时,我发现WSDL是使用.NET 2.0框架编译的......因此需要将其添加为Web引用。

根据我迄今为止所做的研究,我发现Silverlight不支持添加Web Reference。所以我尝试将它作为Web引用添加到托管ASP.NET应用程序,然后启动服务器。

回到我的Silverlight应用程序中,我选择了添加服务引用的选项,并在http://localhost:55265/Web%20References/THINKWebService/SLWebSvc_734_Upgrade.wsdl处指向了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而导致的(不确定,但是,如果我将收到此错误,如果sub - 元素也有属性)。

我在IsWrapped=true中对IsWrapped=false Reference.cs进行了查找/替换,但我得到了同样的错误,但最后一个字是假而不是真。

我不确定我是否对我之后的内容有任何意义,所以这里生成的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>
...

所以在这一点上,我完全迷失了。任何见解将不胜感激。如果我能提供任何其他信息,请告诉我。

1 个答案:

答案 0 :(得分:2)

虽然可能正常的解决方案是假设它只是“另一个数据源”并使用服务器端的Web引用来提供数据(并提供隔离以防止未来的更改)。

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

让您的Silverlight应用程序保持苗条,让服务器为您做任何繁重的工作。