我正在开发一个ASP.NET Web Api项目,并使其接受url中的版本信息.
例如:
- API/V1/myController的
- API/V2/myController的
现在我想在自定义LayoutRenderer中获取请求版本v1,v2Nlog.通常我会像下面的例子那样做.
[LayoutRenderer("Version")]
public class VersionLayoutRenderer : LayoutRenderer
{
protected override void Append(System.Text.StringBuilder builder, NLog.LogEventInfo logEvent)
{
var version = HttpContext.Current.Request.RequestContext.RouteData.Values["Version"];
builder.Append(version);
}
}
Run Code Online (Sandbox Code Playgroud)
问题: HttpContext.Current是NULL
我相信这是因为我使用异步包装为NLog与记录仪前几个电话也是Async.
在Ninject.Extensions.WebApi.UsageLogger中将记录器称为Async的示例.此时,HttpRequestMessage我们需要获取版本所需的所有信息.
/// <summary>
/// Initializes a new instance of the <see cref="UsageHandler" /> class.
/// </summary>
public UsageHandler()
{
var kernel = new StandardKernel();
var logfactory = kernel.Get<ILoggerFactory>();
this.Log = logfactory.GetCurrentClassLogger();
}
protected override async Task<HttpResponseMessage> …Run Code Online (Sandbox Code Playgroud) 我是新来的依赖注入,但高兴Ninject和Ninject.Extensions.Logging对[Inject]我的ILogger地方,我需要它.
然而,一些DelegatingHandler正在破坏所有的乐趣.
public class HttpsHandler : DelegatingHandler
{
[Inject]
public ILogger Logger { get; set; }
protected override Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request, CancellationToken cancellationToken)
{
if (!string.Equals(request.RequestUri.Scheme, "https", StringComparison.OrdinalIgnoreCase))
{
Logger.Info(String.Format("{0}: is using HTTP", request.RemoteAddress());
return
Task.Factory.StartNew(
() =>
new HttpResponseMessage(HttpStatusCode.BadRequest)
{
Content = new StringContent("HTTPS Required")
});
}
return base.SendAsync(request, cancellationToken);
}
}
Run Code Online (Sandbox Code Playgroud)
有人能指出我如何在委托操作员内部将Ninject.Extensions.Logger.Nlog2注入Ilogger吗?
更新
我认为Pete在评论中让我的方向正确(谢谢!).我将以下构造函数添加到HttpsHandler:
public HttpsHandler()
{
var kernel = new StandardKernel();
var logfactory = …Run Code Online (Sandbox Code Playgroud) c# dependency-injection ninject ninject.web.mvc asp.net-web-api
我在我的WebApi项目中使用基于声明的授权,并且有一种方法可以检查当前身份是否经过身份验证.当我使用ClaimsPrincipal.Current当前身份未经过身份验证但我使用Thread.CurrentPrincipal它时.
ClaimsPrincipal.Current.Identity.IsAuthenticated; //False
Thread.CurrentPrincipal.Identity.IsAuthenticated; //True
Run Code Online (Sandbox Code Playgroud)
这看起来很奇怪,特别是因为MSDN说 ClaimsPrincipal.Current只返回Thread.CurrentPrincipal:
备注
默认情况下,返回Thread.CurrentPrincipal.您可以通过设置ClaimsPrincipalSelector属性来指定要调用的委托来确定当前主体,从而更改此行为.
有人可以解释一下为什么ClaimsPrincipal没有经过身份验证,而理论上两者都包含相同的身份?
每当我们使用DotNetOpenAuthnew 刷新我们的授权Oauth2.0 RefreshToken时,响应中都会包含它。由于RefreshToken本身是一个长期存在的令牌,我们RefreshToken在每次请求后都会得到一个新令牌的原因是什么?
处理这个新的 RefreshTokens 的最佳方法是什么,我们应该在RefreshToken每次刷新授权时存储新的还是只保留旧的RefreshToken而忽略新的?
另请参阅此示例代码以提供一些上下文。
var serviceDescription = new AuthorizationServerDescription
{
ProtocolVersion = ProtocolVersion.V20,
TokenEndpoint = new Uri(Constants.TokenEndPoint)
};
var client = new WebServerClient(serviceDescription,
Constants.ClientId, Constants.ClientSecret);
var authorization = new AuthorizationState()
{
//Insert our stored RefreshToken
RefreshToken = TokenStore.Instance.RefreshToken
};
if (client.RefreshAuthorization(authorization))
{
//Store or ignore the new RefreshToken?
var NewRefreshToken = authorization.RefreshToken;
}
Run Code Online (Sandbox Code Playgroud) 我的Logging设置是TraceSource为每个使用不同的Class.
是否可以配置为所有源写入事件的通配符?
<system.diagnostics>
<sources>
<source name ="wildcard" switchValue="Warning">
<listeners>
<add name="textlog" />
</listeners>
</source>
<source name="MySpecificClass" switchValue="All">
<listeners>
<add name="textlog" />
</listeners>
</source>
</sources>
<sharedListeners>
<add name="textlog"
type="System.Diagnostics.TextWriterTraceListener"
initializeData="Log.log">
</add>
</sharedListeners>
<trace autoflush="true"/>
</system.diagnostics>
Run Code Online (Sandbox Code Playgroud) 由于我目前正在设置Logging in my(Asp.Net Web Api)应用程序,因此我正在阅读根据日志记录的最佳实践.我提出了关于记录最佳实践的问题.
我走的是Ninject- > Logging Extensions- > Nlog / Log4Net方式,但这个问题(或者我应该说答案)让我第二次思考.
在我启用跟踪的那一刻,记录每一个地方,并且让日志和跟踪不加起来感觉有点混乱.
我认为当我切换到诊断跟踪并在框架已经给我的基础上构建时,我最终会得到更完整的跟踪.讲述一个完整故事的痕迹对我来说听起来更有用,然后是一个单独的跟踪和日志,它们都知道故事的一部分.当然,我总是可以通过听众和过滤器再次分开.
但另一方面,我总是学到:
记录!=追踪
所以这给我留下了一个问题,如果我放弃了日志框架,它是项目的起始阶段,还是我应该坚持下去?
如果我删除日志框架,我是否应该使用接口以防我们再次想要切换到另一个日志/跟踪框架,或者我可以只依赖System.Diagnostics?
如何使用Webrequest Credentials属性发送基本身份验证标头?即使PreAuthenticate设置为true,为什么Authorization标头不会随请求一起发送?
WebRequest request = (HttpWebRequest)WebRequest.Create("https://api.github.com/user");
request.Credentials = new NetworkCredential("githubUsername", "githubPassword");
request.PreAuthenticate = true;
var response = request.GetResponse();
Run Code Online (Sandbox Code Playgroud) 我使用 Elmah 记录错误,ErrorLog.GetDefault因为我想使用 ErrorId。但是,当我执行此操作时,服务器变量不包含在日志条目中。谁能解释一下为什么,如果可能的话,如何解决这个问题?
public void LogExceptionToElmah(Exception exception)
{
//Includes Server Variables
ErrorSignal.FromContext(HttpContext.Current).Raise(exception);
//Does not include Server Variables
var elmahId = Elmah.ErrorLog.GetDefault(HttpContext.Current).Log(new Error(exception));
}
Run Code Online (Sandbox Code Playgroud)