我正在开发一个 Silverlight 3 应用程序,我想使用提供的 .dll 或 SOAP 连接到 Web 服务。但是 .dll 不适合 Silverlight,所以我不能这样做。而且由于跨域问题,我无法访问 SOAP 服务(我不托管它,所以 clientpolicy xml 不会这样做)。
所以我的解决方案是在我自己的域中的启用 WCF 的 Web 服务中包含 .dll,并让 Silverlight 应用程序调用 Web 服务。这行得通。
现在我的问题:从我的 web 服务引用的 .dll 提供的客户端有一个 .Connect() 方法,所以我必须保存对象的状态。但我可以这样做吗?可能不是因为 Silverlight 不支持 wsHttpBinding。我知道我可以访问 ASP 会话变量,但我也可以在浏览器外执行该操作吗?我只能找出一个解决我的问题的方法,那就是在 ASP 会话中保存用户名/密码并在每个方法中调用 .Connect() 方法。但这确实是一个糟糕的解决方案。
更好的想法?
我认为我没有说清楚,对此我深表歉意。我的英语是正确的主要原因。
我有:
我的 Silverlight 应用程序在网站和浏览器外运行
我的 WCF 服务托管在同一域中。
跨域网络服务(我无法访问存储跨域策略文件)
我的 WCF Web 服务在我的应用程序和跨域 Web 服务之间提供了一个层,因为没有策略文件就无法添加跨域 Web 服务。
我的网络服务看起来像这样(以抽象的方式):
class MyWebService
{
CrossDomainWebServiceClient client = new CrossDomainWebServiceClient();
public void Connect(string username, string password)
{
client.Connect(username, password);
}
public object Foo()
{
//GetEmployees() do only work if I'm connected
return client.GetEmployees();
}
}
Foo() 方法不起作用,因为它是每次调用的会话,而不是每个实例的会话。我想让这个工作。因此需要为下一次调用保留客户端对象。Session.required 在 Silverlight 中不起作用,因为显然不支持 wsHttpBinding。