- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个使用 AJAX 从页面在 ASP.Net 站点中使用的 WCF REST 服务。
我希望能够从我的服务异步调用方法,这意味着我将在我的 javascript 代码中有回调处理程序,并且当方法完成时,输出将被更新。这些方法应该在不同的线程中运行,因为每个方法将花费不同的时间来完成它们的任务
我的代码处于半工作状态,但发生了一些奇怪的事情,因为我第一次执行代码编译后,它可以工作,在不同的线程中运行每个调用 但是后续调用会阻塞服务,这样每个方法调用都必须等到最后一个调用结束才能执行下一个调用。他们在同一个线程上运行。我以前在使用 Page Methods 时遇到过同样的问题,我通过禁用页面中的 session 解决了这个问题,但我还没有想出如何在使用 WCF REST 服务时做同样的事情
注意:方法完成时间(异步运行它们应该只需要 7 秒,结果应该是:Execute1 - Execute3 - Execute2)
Execute1
--> 2 秒Execute2
--> 7 秒Execute3
--> 4 秒
我会发布代码...我会尽量简化它
[ServiceContract(
SessionMode = SessionMode.NotAllowed
)]
public interface IMyService
{
// I have other 3 methods like these: Execute2 and Execute3
[OperationContract]
[WebInvoke(
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json,
UriTemplate = "/Execute1",
Method = "POST")]
string Execute1(string param);
}
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(
InstanceContextMode = InstanceContextMode.PerCall
)]
public class MyService : IMyService
{
// I have other 3 methods like these: Execute2 (7 sec) and Execute3(4 sec)
public string Execute1(string param)
{
var t = Observable.Start(() => Thread.Sleep(2000), Scheduler.NewThread);
t.First();
return string.Format("Execute1 on: {0} count: {1} at: {2} thread: {3}", param, "0", DateTime.Now.ToString(), Thread.CurrentThread.ManagedThreadId.ToString());
}
}
<%@ Page EnableSessionState="False" Title="Home Page" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
CodeBehind="Default.aspx.cs" Inherits="RestService._Default" %>
<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
<script type="text/javascript">
function callMethodAsync(url, data) {
$("#message").append("<br/>" + new Date());
$.ajax({
cache: false,
type: "POST",
async: true,
url: url,
data: '"de"',
contentType: "application/json",
dataType: "json",
success: function (msg) {
$("#message").append("<br/> " + msg);
},
error: function (xhr) {
alert(xhr.responseText);
}
});
}
$(function () {
$("#callMany").click(function () {
$("#message").html("");
callMethodAsync("/Execute1", "hello");
callMethodAsync("/Execute2", "crazy");
callMethodAsync("/Execute3", "world");
});
});
</script>
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
<input type="button" id="callMany" value="Post Many" />
<div id="message">
</div>
</asp:Content>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
</system.webServer>
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
<standardEndpoints>
<webHttpEndpoint>
<standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true" />
</webHttpEndpoint>
</standardEndpoints>
</system.serviceModel>
void Application_Start(object sender, EventArgs e)
{
RouteTable.Routes.Ignore("{resource}.axd/{*pathInfo}");
RouteTable.Routes.Add(new ServiceRoute("",
new WebServiceHostFactory(),
typeof(MyService)));
}
我尝试了几种组合,但结果是一样的,我使用 Visual Studio 进行测试,但现在我在 IIS 7 上进行测试,结果相同
我尝试了以下属性的组合:
[ServiceBehavior(
InstanceContextMode = InstanceContextMode.PerCall,
ConcurrencyMode = ConcurrencyMode.Multiple
)]
我也删除了 Rx 的使用,现在我只是模拟像这样的长进程操作:
Thread.Sleep(2000);
但结果是一样的.... 编译和部署后,(第一次调用)服务正常工作,它在不同的线程上执行,给出了期望的结果,但后续调用在同一个线程上运行线程....我不明白
我刚刚注意到一些事情,编译后的第一次工作,并且最后使用的线程始终是后续调用使用的线程,并且这个线程被阻塞,就像其他线程一样' t disposed 之类的,或者如果最后一个线程由于某种原因被阻塞了
这是这个项目的完整代码(RestWCF.zip)
最佳答案
我下载了你们的源代码,我自己做了一些测试。我设法通过将它添加到 web.config 来让它工作:
<sessionState mode="Off"></sessionState>
问题似乎与 Asp.Net session 处理有关(似乎与 WCF session 不同)。
如果没有这个,Fiddler 会显示 WCF 服务响应正在发送 ASP.NET_SessionId
cookie。您的 Page
级别 EnableSessionState="False"
不影响服务。
编辑:我做了一些更多的测试,看看我是否可以让它工作而不必关闭整个应用程序的 session 状态。我现在开始工作了。我所做的是:
然后在 Global.asax
中我更改了 ServiceRoute
注册:
RouteTable.Routes.Add(new ServiceRoute("ServiceFolder/",
new WebServiceHostFactory(),
typeof(MyService)));
在 Default.aspx 中我更改了:
$(function () {
$("#callMany").click(function () {
$("#message").html("");
callMethodAsync('<%=this.ResolveUrl("~/ServiceFolder/Execute1") %>', "hello");
callMethodAsync('<%=this.ResolveUrl("~/ServiceFolder/Execute2") %>', "crazy");
callMethodAsync('<%=this.ResolveUrl("~/ServiceFolder/Execute3") %>', "world");
});
});
然后,为了控制 cookie 处理,我创建了一个 HttpModule
:
using System;
using System.Web;
namespace RestService
{
public class TestPreventCookie : IHttpModule
{
public void Dispose()
{
}
public void Init(HttpApplication application)
{
application.BeginRequest +=
(new EventHandler(this.Application_BeginRequest));
application.PostAcquireRequestState +=
(new EventHandler(this.Application_PostAcquireRequestState));
}
private void Application_BeginRequest(Object source, EventArgs e)
{
//prevent session cookie from reaching the service
HttpApplication application = (HttpApplication)source;
HttpContext context = application.Context;
if (context.Request.Path.StartsWith("/ServiceFolder"))
{
context.Request.Cookies.Remove("ASP.NET_SessionId");
}
}
private void Application_PostAcquireRequestState(Object source, EventArgs e)
{
HttpApplication application = (HttpApplication)source;
HttpContext context = application.Context;
if (context.Request.Path.StartsWith("/ServiceFolder"))
{
var s = context.Session;
if (s != null)
s.Abandon();
}
}
}
}
然后我在 web.config 中注册了这个模块:
<httpModules>
<add name="TestPreventCookie" type="RestService.TestPreventCookie" />
</httpModules>
最后,我更改 Default.aspx 以允许 session :
EnableSessionState="True"
在这些更改之后,服务调用的并行执行工作。强制免责声明:
It works on my machine
想法是,当对服务的调用传入时,HttpModule 检查 URL,并在必要时删除 ASP.NET_SessionId
cookie,这样它就不会到达服务。然后在 Application_PostAcquireRequestState
中,我们立即放弃创建的 session ,这样我们就不会不必要地为大量空 session 消耗服务器内存。
使用此解决方案,您将获得:
代价是:
关于c# - 在 ASP.Net 站点中使用 AJAX 调用时,REST WCF 服务会锁定线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11250109/
创建使用.NET框架的asp.net页面时,访问该页面的客户端是否需要在其计算机上安装.NET框架? IE。用户访问www.fakesite.com/default.aspx,如果他们没有安装框架,他
我阅读了很多不同的博客和 StackOverflow 问题,试图找到我的问题的答案,但最后我找不到任何东西,所以我想自己问这个问题。 我正在构建一个应用程序,其中有一个长时间运行的工作线程,它执行一些
已锁定。这个问题及其答案是locked因为这个问题是题外话,但却具有历史意义。目前不接受新的答案或互动。 我一直想知道为什么微软为这样一个伟大的平台选择了一个如此奇怪的、对搜索引擎不友好的名称。他们就
.Net Framework .Net .NET Standard的区别 1、.NET Framework 在未来.NET Framework或许成为过去时,目前还是有很多地方在使用的。这一套
如果有选择的话,您会走哪条路? ASP.NET Webforms + ASP.NET AJAX 或 ASP.NET MVC + JavaScript Framework of your Choice
我有一个 Web 服务,它通过专用连接通过 https 使用第三方 Web 服务,我应用了 ServicePointManager.ServerCertificateValidationCallbac
为什么我应该选择ASP.NET Web Application (.NET Framework)而不是ASP.NET Core Web Application (.NET Framework)? 我在
我在网络上没有找到任何关于包含 .NET Standard、.NET Core 和 .NET Framework 项目的 .NET 解决方案的公认命名约定。 就我而言,我们在 .NET 框架项目中有以
.NET Compact 是 .NET 的完美子集吗? 假设我考虑了屏幕大小和其他限制并避免了 .NET Compact 不支持的类和方法,或者 .NET Compact 是一个不同且不兼容的 GUI
我已经阅读了所有我能找到的关于 connectionManagement 中的 maxconnection 设置的文章:即 http://support.microsoft.com/kb/821268
我现在正在使用asp.net mvc,想知道使用内置的Json或 Json.Net哪个是更好的选择,但我不确定一个人是否比另一个人有优势。 另外,如果我确实选择沿用Json.Net的路线,那么我应该选
在 Visual Studio 中,您至少可以创建三种不同类型的类库: 类库(.NET Framework) 类库(.NET 标准) 类库(.NET Core) 虽然第一个是我们多年来一直使用的,但我
.NET 和 ASP.NET 之间有什么区别?它们有什么关系? 最佳答案 ASP.Net 基于 .Net 框架构建,提供有关 Web 开发的附加功能。 你可以去看看wikipedia article
在安装更高版本(3.0)之前,我需要安装.net框架1.1和2.0吗?或者单独安装 3.0 框架就足够了,并为在早期框架版本上编写的软件提供支持?谢谢 ,丽然 最佳答案 不,您不必安装以前的框架。 我
我正在开发一个项目,人们可以“更新”类别,例如更改类别的名称。我收到以下消息 This is called after clicking update 按钮 with the SQL statemen
.NET 类 System.Net.CookieContainer 线程安全吗? --更新:交 key 答复-- 是否有任何方法可以确保异步请求期间修改的变量(即 HttpWebRequest.Coo
我正在使用 JScript.NET 在我编写的 C# WinForms 应用程序中编写脚本。它工作得很好,但我只是尝试在脚本中放置一些异常处理,但我无法弄清楚如何判断我的 C# 代码抛出了哪种类型的异
我需要你的帮助, 比如我有一个小数类型的变量,我想这样取整。 例如 3.0 = 3 3.1 = 4 3.2 = 4 3.3 = 4 3.4 = 4 3.5 = 4 3.6 = 4 3.7 = 4 3.
我使用过这样的代码:http://msdn.microsoft.com/en-us/library/dw70f090.aspx在 ASP.NET 中工作之前访问数据库(2-3 年前)。我没有意识到我正
自 ConfigurationManager .NET Standard 中不存在,检索正在执行的程序集的应用程序设置的最佳方法是什么,无论是 web.config或 appSettings.{env
我是一名优秀的程序员,十分优秀!