我的问题与此有点相关:具有依赖注入的HttpContext.Items的WebApi等价物.
我们想使用Ninject在WebApi区域中使用HttpContext.Current注入一个类.
我担心的是,这可能非常危险,因为在WebApi(一切?)是异步的.
如果我在这些方面有误,请纠正我,这是我到目前为止调查的内容:
HttpContext.Current通过Thread获取当前上下文(我直接查看了实现).
在异步任务中使用HttpContext.Current是不可能的,因为它可以在另一个Thread上运行.
WebApi使用IHttpController和method Task<HttpResponseMessage> ExecuteAsync=>每个请求都是async =>你不能在action方法中使用HttpContext.Current.它甚至可能发生,更多的请求是通过相同的线程在同一个线程上执行的.
为了创建带有注入内容的控制器到构造函数中,IHttpControllerActivator与sync方法一起使用IHttpController Create.这是,ninject创建Controller及其所有依赖项.
如果我在所有这4点中都是正确的,那么在动作方法或下面的任何层中使用HttpContext.Current是非常危险的,并且可能会产生意外结果.我看到很多公认的答案正是如此.恕我直言,这可以工作一段时间,但会在负载下失败.
但是当使用DI创建一个Controller及其依赖项时,它是好的,因为它运行在一个独立的线程上.我可以从构造函数中的HttpContext获取一个值,它会安全吗?.我想知道每个Controller是否在每个请求的单个线程上创建,因为这可能会导致重负载下的问题,其中可以使用来自IIS的所有线程.
只是为了解释为什么我要注入HttpContext的东西:
我们想要的解决方案:它们之间的所有层都没有被这个感染,我们可以在代码深处使用注入的请求(例如在一些依赖于URL的ConfigurationProvider中)
如果我完全错误或者我的建议是正确的,请告诉我你的意见,因为这个主题似乎非常复杂.Thx提前!
multithreading asynchronous ninject httpcontext asp.net-web-api
我试图在我的请求中放置一个授权标题,但它不起作用.
我用这个:
var config = {headers: {
'Authorization': token
}
};
return $http.get('http://localhost:3000/apis/users/all', config);
Run Code Online (Sandbox Code Playgroud)
我也试过这个:
$http.defaults.headers.common['Authorization'] = token;
Run Code Online (Sandbox Code Playgroud)
但在这两种情况下,我在后端请求中得到了这个标头:
Accept:*/*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:es-ES,es;q=0.8,ca;q=0.6,en;q=0.4,gl;q=0.2
Access-Control-Request-Headers:accept, authorization
Access-Control-Request-Method:GET
Connection:keep-alive
Host:localhost:3000
Origin:http://localhost:8000
Referer:http://localhost:8000/
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.85 Safari/537.36
Run Code Online (Sandbox Code Playgroud)
我需要这样的东西:
Authorization: token
Run Code Online (Sandbox Code Playgroud)
但我得到了这个:
Access-Control-Request-Headers:accept, authorization
Run Code Online (Sandbox Code Playgroud)
然后,我没有任何地方的令牌值.
我使用expressjs作为后端,我将它用于CORS:
app.use(function(req, res, next) {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept, Authorization');
next();
});
Run Code Online (Sandbox Code Playgroud)
还说使用chrome扩展Advance Rest Client进行测试它工作正常.在请求标头中有一个Authorization:valueOfToken ..
非常感谢.