在Katana(OWIN)实现中实现全局异常捕获器处理程序的正确方法是什么?
在作为Azure云服务(工作者角色)运行的自托管OWIN/Katana实现中,我将此代码放在中间件中:
throw new Exception("pooo");
Run Code Online (Sandbox Code Playgroud)
然后我将此代码放在Startup类Configuration方法中,在事件处理程序中设置断点:
AppDomain.CurrentDomain.UnhandledException +=
CurrentDomain_UnhandledExceptionEventHandler;
Run Code Online (Sandbox Code Playgroud)
和同一个类中的事件处理程序(在第一行设置断点):
private static void CurrentDomain_UnhandledExceptionEventHandler(object sender, UnhandledExceptionEventArgs e)
{
var exception = (Exception)e.ExceptionObject;
Trace.WriteLine(exception.Message);
Trace.WriteLine(exception.StackTrace);
Trace.WriteLine(exception.InnerException.Message);
}
Run Code Online (Sandbox Code Playgroud)
代码运行时,不会触发断点.Visual Studio输出窗口确实包括此:
A first chance exception of type 'System.Exception' occurred in redacted.dll
A first chance exception of type 'System.Exception' occurred in mscorlib.dll
Run Code Online (Sandbox Code Playgroud)
我也尝试将连接和处理程序移动到Worker Role OnStart方法,但仍然没有命中断点.
我根本没有使用WebAPI,但确实查看过那里做的帖子,但我没有发现任何明确的内容,所以我在这里.
在.NET Framework 4.5.2,VS 2013上运行.
所有想法都赞赏.谢谢.
如果我使用像OwinMiddleware和IOwinContext这样的Microsoft.Owin类型构建OWIN中间件,我的中间件是否可以与非Microsoft Owin主机/服务器一起使用?我正在研究Nancy和SignalR的中间件类,它们看起来与OwinMiddleware基类非常不同,中间件就像Cookie认证中间件和WebApi一样.我正在阅读规范,但我仍然不清楚非Microsoft Owin服务器是否可以使用OwinMiddleware和IOwinContext类型而不依赖于Microsoft.Owin(我猜这会破坏Owin的目的).
使用具有单个用户帐户的默认Visual Studio 2013 Web API项目模板,并使用application/xml的Accept标头发布到/ token端点,服务器仍然以JSON方式返回响应:
{"access_token":"...","token_type":"bearer","expires_in":1209599}
Run Code Online (Sandbox Code Playgroud)
有没有办法将令牌恢复为XML?
我正在尝试编写一个Owin midleware组件,它将记录每个传入的请求和对数据库的响应.
这是我设法得到多远.
我一直在阅读回复.说:
Stream不支持阅读.
我如何阅读Response.Body?
public class LoggingMiddleware : OwinMiddleware
{
private static Logger log = LogManager.GetLogger("WebApi");
public LoggingMiddleware(OwinMiddleware next, IAppBuilder app)
: base(next)
{
}
public override async Task Invoke(IOwinContext context)
{
using (var db = new HermesEntities())
{
var sw = new Stopwatch();
sw.Start();
var logRequest = new log_Request
{
Body = new StreamReader(context.Request.Body).ReadToEndAsync().Result,
Headers = Json.Encode(context.Request.Headers),
IPTo = context.Request.LocalIpAddress,
IpFrom = context.Request.RemoteIpAddress,
Method = context.Request.Method,
Service = "Api",
Uri = context.Request.Uri.ToString(),
UserName = context.Request.User.Identity.Name
};
db.log_Request.Add(logRequest); …
Run Code Online (Sandbox Code Playgroud) 这个问题之前已经被提出了几个问题,但是我无法得到任何工作的答案,我正在失去我的头发并且不确定问题是否只是解决方案来自2年前并且事情已经发生了变化.
如何在一个自定义的Owin中间件中安全地拦截响应流 - 我基于此我的代码,它看起来应该工作,但它不
OWIN OnSendingHeaders回调 - 读取响应主体 - 似乎是一个不同的OWIN版本,因为方法签名不起作用
我想要做的是编写一个可以检查来自MVC的响应流的OMC.
我所做的(在其他几次尝试中)是添加一个OMC,它将context.Response.Body设置为MemoryStream,因此我可以回放它并检查下游组件写的内容:
public async Task Invoke(IDictionary<string, object> env)
{
IOwinContext context = new OwinContext(env);
// Buffer the response
var stream = context.Response.Body;
var buffer = new MemoryStream();
context.Response.Body = buffer;
.......
Run Code Online (Sandbox Code Playgroud)
我发现MemoryStream总是空的,除非我从另一个OMC写入它. 所以看起来下游的OMC正在使用我的MemoryStream,但是MVC响应不是,好像OWIN管道在请求进入MVC之前完成了,但是这不对吗?
完整代码:
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
ConfigureAuth(app);
app.Use(new ResponseExaminerMiddleware());
// Specify the stage for the OMC
//app.UseStageMarker(PipelineStage.Authenticate);
}
}
public class ResponseExaminerMiddleware
{
private AppFunc next;
public void Initialize(AppFunc next)
{
this.next …
Run Code Online (Sandbox Code Playgroud)