我在设计从ASP.NET应用程序调用双工WCF服务的最佳方法时遇到问题我有以下情况:
1)我有一些具有一些操作的双工WCF服务
2)从ASP.NET Web应用程序(我的客户端),我使默认页面实现回调接口,然后从双工服务调用一个方法发送自己作为回调的处理程序
3)当default.aspx
页面上的回调返回时,我无法在页面上显示结果,因为整个HttpContext
为空,因此我无法访问任何控件或Application []或Session []变量
以下是Default.aspx中的代码
[CallbackBehavior(UseSynchronizationContext = false)]
public partial class _Default : System.Web.UI.Page, VehicleTrackingService.IDuplexServiceCallback
{
public _Default()
{
}
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(delegate
{
try
{
DuplexService client = new DuplexServiceClient(new InstanceContext(new_Default()));
switch (DropDownList1.SelectedItem.Value)
{
case "0":
{
client.Method1(int.Parse(txt_name.Text));
break;
}
case "1":
{
lbl_res.Text = "Not Provided yet.";
break;
}
default:
{
lbl_res.Text = "Not Provided yet.";
break;
}
}
}
catch(Exception ex)
{
}
}));
}
public void DuplexCallbackFunction(string response)
{
// Wanna to show result (the response) from here ...
}
请帮助吗?
答案 0 :(得分:0)
在服务器上处理页面时,您正在从ASP.Net页面调用WCF服务。
这个问题是页面在服务器上的时间非常短,不到一秒钟。然后,在WCF服务响应之前,页面已返回到浏览器。
正如Lloyd所说,修复此问题的方法是使用AJAX从浏览器调用Web服务。
有关如何执行此操作的一个示例,请参阅http://www.codeproject.com/Articles/128478/Consuming-WCF-REST-Services-Using-jQuery-AJAX-Call
答案 1 :(得分:0)
您必须记住,您的应用程序由作为服务器访问ASP.NET应用程序的浏览器客户端组成,并且这两者通过HTTP请求和响应进行通信。在WCF服务将消息发送回ASP.NET应用程序之前,您的ASP.NET应用程序很可能已将HTTP响应发送回浏览器。
我认为西拉和劳埃德提出了一个很好的建议;尝试直接从浏览器调用WCF服务。 This answer表明可以使用JavaScript与WCF服务进行双工通信。
但是,可能存在多种原因导致您无法执行此操作,例如凭据,网络防火墙规则或仅仅是ASP.NET应用程序具有调用WCF服务所需的数据这一事实,也许你不想将这些数据暴露给浏览器。
在这些情况下,您可以选择实施复杂的解决方案,这些解决方案涉及在浏览器中使用JavaScript来轮询ASP.NET服务器以获取更新。有几种方法可以做到这一点。有“短轮询”和“长轮询”。还有一个名为WebSockets的相对较新的功能,但是您的服务器和目标浏览器是否支持WebSockets是另一个问题。