【问题标题】:How to get method name from HttpRequestMessage?如何从 HttpRequestMessage 中获取方法名称?
【发布时间】:2021-11-26 08:21:04
【问题描述】:

我有如下处理程序,我想从Controller 获取方法名称。使用var methodName = request.Method; 只返回“GET”或“POST”之类的方法类型。如何获取方法名称,例如。从 'http://localhost:4200/weatherforecast/getitem/2 我想返回“getitem”。

public class RequestAndResponseHandler : DelegatingHandler
{
    protected override async Task<HttpResponseMessage> SendAsync(
    HttpRequestMessage request, CancellationToken cancellationToken)
    {
        if (request.Content != null)
        {
            string requestBody = await request.Content.ReadAsStringAsync();
            Trace.WriteLine(requestBody);
        }
        var response = await base.SendAsync(request, cancellationToken);

        if (response.Content != null)
        {
            var responseBody = await response.Content.ReadAsStringAsync();
            Trace.WriteLine(responseBody);
        }

        var methodName = request.Method;

        return response;
    }
}

【问题讨论】:

标签: c# .net rest asp.net-web-api2 webapi


【解决方案1】:

HttpRequestMessage.RequestUri 返回 System.Uri 对象。 你可以使用

var Segments = filterContext.Request.RequestUri.Segments;

获取您请求的不同部分。要消除查询部分,您可以使用 HttpRequestMessage.RequestUri.Query

您需要查看与您相关的细分。在您的具体情况下,它将发送您想要的最后一段。

【讨论】:

    【解决方案2】:

    使用request.RequestUri.ToString()可以获取方法名。

    以下代码将帮助您详细的请求和响应拦截。

    public class CustomLogHandler : DelegatingHandler
    {
    
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        var logMetadata = await BuildRequestMetadata(request);
        var response = await base.SendAsync(request, cancellationToken);
        logMetadata = await BuildResponseMetadata(logMetadata, response);
        await SendToLog(logMetadata);
        return response;
    }
    private async Task<LogMetadata> BuildRequestMetadata(HttpRequestMessage request)
    {
        LogMetadata log = new LogMetadata
        {
            RequestMethod = request.Method.Method,
            RequestTimestamp = DateTime.Now,
            RequestUri = request.RequestUri.ToString(),
            RequestContent = await request.Content.ReadAsStringAsync(),
        };
        return log;
    }
    private async Task<LogMetadata> BuildResponseMetadata(LogMetadata logMetadata, HttpResponseMessage response)
    {
        logMetadata.ResponseStatusCode = response.StatusCode;
        logMetadata.ResponseTimestamp = DateTime.Now;
        logMetadata.ResponseContentType = response.Content == null ? string.Empty : response.Content.Headers.ContentType.MediaType;
        logMetadata.Response = await response.Content.ReadAsStringAsync();
        return logMetadata;
    }
    private async Task<bool> SendToLog(LogMetadata logMetadata)
    {
        try
        {
         //write this code
        }
        catch
        {
            return false;
        }
        return true;
    }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-03-27
      • 2015-05-22
      • 1970-01-01
      • 1970-01-01
      • 2012-10-25
      • 1970-01-01
      • 1970-01-01
      • 2018-01-26
      • 2013-07-07
      相关资源
      最近更新 更多