我试图在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>
...
所以在这一点上,我完全迷失了。任何见解将不胜感激。如果我能提供任何其他信息,请告诉我。
答案 0 :(得分:2)
虽然可能正常的解决方案是假设它只是“另一个数据源”并使用服务器端的Web引用来提供数据(并提供隔离以防止未来的更改)。
Silverlight App <=> Silverlight Web Services <= External/Legacy Web Service
让您的Silverlight应用程序保持苗条,让服务器为您做任何繁重的工作。