小编Jos*_*nke的帖子

Web Api - 控制器外部的请求参数

我正在开发一个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)

c# asp.net-mvc ninject httpcontext asp.net-web-api

7
推荐指数
1
解决办法
6085
查看次数

将依赖项注入DelegatingHandler

我是新来的依赖注入,但高兴NinjectNinject.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

7
推荐指数
1
解决办法
7450
查看次数

Thread.CurrentPrincipal已经过身份验证,但ClaimsPrincipal.Current不是

我在我的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没有经过身份验证,而理论上两者都包含相同的身份?

c# identity claims-based-identity .net-4.5 asp.net-web-api

7
推荐指数
1
解决办法
1万
查看次数

如何处理使用 DotNetOpenAuth 刷新授权后收到的新 RefreshToken

每当我们使用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)

c# dotnetopenauth oauth-2.0

5
推荐指数
1
解决办法
1201
查看次数

System.Diagnostics跟踪通配符以获取源名称

我的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)

.net c# system.diagnostics

5
推荐指数
1
解决办法
1451
查看次数

记录框架与System.Diagnostics跟踪

由于我目前正在设置Logging in my(Asp.Net Web Api)应用程序,因此我正在阅读根据日志记录的最佳实践.我提出了关于记录最佳实践的问题.

我走的是Ninject- > Logging Extensions- > Nlog / Log4Net方式,但这个问题(或者我应该说答案)让我第二次思考.

在我启用跟踪的那一刻,记录每一个地方,并且让日志和跟踪不加起来感觉有点混乱.

我认为当我切换到诊断跟踪并在框架已经给我的基础上构建时,我最终会得到更完整的跟踪.讲述一个完整故事的痕迹对我来说听起来更有用,然后是一个单独的跟踪和日志,它们都知道故事的一部分.当然,我总是可以通过听众和过滤器再次分开.

但另一方面,我总是学到:

记录!=追踪

所以这给我留下了一个问题,如果我放弃了日志框架,它是项目的起始阶段,还是我应该坚持下去?

如果我删除日志框架,我是否应该使用接口以防我们再次想要切换到另一个日志/跟踪框架,或者我可以只依赖System.Diagnostics?

.net asp.net-mvc logging trace asp.net-web-api

4
推荐指数
1
解决办法
3616
查看次数

如何使用HttpWebRequest.Credentials属性进行基本身份验证?

如何使用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)

.net c# authentication

4
推荐指数
1
解决办法
2万
查看次数

Elmah 日志条目不包括服务器变量

我使用 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)

elmah

2
推荐指数
1
解决办法
576
查看次数