相关疑难解决方法(0)

如何在asp.net核心webapi控制器中读取请求体?

我正试图在OnActionExecuting方法中读取请求体,但我总是null为身体做准备.

var request = context.HttpContext.Request;
var stream = new StreamReader(request.Body);
var body = stream.ReadToEnd();
Run Code Online (Sandbox Code Playgroud)

我试图将流位置显式设置为0,但这也不起作用.由于这是ASP.NET CORE,我认为事情没有什么不同.我可以在这里看到所有的示例,指的是旧的webapi版本.
有没有其他方法这样做?

c# asp.net-web-api asp.net-core

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

如何获取HttpRequestMessage数据

我有一个MVC API控制器,具有以下操作.

我不明白如何阅读消息的实际数据/正文?

[HttpPost]
public void Confirmation(HttpRequestMessage request)
{
    var content = request.Content;
}
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc

50
推荐指数
3
解决办法
9万
查看次数

为什么Web API请求的主体只读一次?

我的目标是使用AuthorizationFilter或DelegatingHandler对Web API请求进行身份验证.我想在几个地方寻找客户端ID和身份验证令牌,包括请求正文.起初看起来这很简单,我可以做这样的事情

var task = _message.Content.ReadAsAsync<Credentials>();

task.Wait();

if (task.Result != null)
{
    // check if credentials are valid
}
Run Code Online (Sandbox Code Playgroud)

问题是HttpContent只能读一次.如果我在处理程序或过滤器中执行此操作,则在我的操作方法中无法使用该内容.我在StackOverflow上找到了一些答案,就像这样:在WebApi控制器读取HttpContent,解释它是故意这样的,但是他们没有说明为什么.这似乎是一个非常严重的限制,阻止我在过滤器或处理程序中使用任何很酷的Web API内容解析代码.

这是技术限制吗?它是否试图阻止我做一件我没看到的非常糟糕的事情(?)?

死后:

我看了一下菲利普建议的来源.ReadAsStreamAsync返回内部流,如果流支持 Seek,没有什么能阻止您调用Seek .在我的测试中,如果我调用ReadAsAsync,那么这样做:

message.Content.ReadAsStreamAsync().ContinueWith(t => t.Result.Seek(0, SeekOrigin.Begin)).Wait();
Run Code Online (Sandbox Code Playgroud)

当它触及我的动作方法时,自动模型绑定过程可以正常工作.我没有使用它,但我选择了更直接的东西:

var buffer = new MemoryStream(_message.Content.ReadAsByteArrayAsync().WaitFor());
var formatters = _message.GetConfiguration().Formatters;
var reader = formatters.FindReader(typeof(Credentials), _message.Content.Headers.ContentType);
var credentials = reader.ReadFromStreamAsync(typeof(Credentials), buffer, _message.Content, null).WaitFor() as Credentials;
Run Code Online (Sandbox Code Playgroud)

使用扩展方法(我在.NET 4.0中没有await关键字)

public static class TaskExtensions
{
    public static T WaitFor<T>(this Task<T> task)
    {
        task.Wait();
        if (task.IsCanceled) { throw …
Run Code Online (Sandbox Code Playgroud)

asp.net asp.net-web-api

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

如何获取已读取的内容

我有一个继承自ApiController的类.它有一个像这样的Put方法:

[PUT("user/{UserId}")]
public HttpResponseMessage Put(string userId, PaymentRequest paymentRequest)
{
    // Calling business logic and so forth here
    // Return proper HttpResponseMessage here
}
Run Code Online (Sandbox Code Playgroud)

该方法在上面工作正常.现在我需要验证方法调用的签名,但在这里我遇到了一个问题.签名本质上是方法+ url + body的组合.我可以通过调用Request.Method和我可以通过调用Request.RequestUri.ToString()得到的url获得的方法,但是我无法得到它之前的身体,因为它被自动反序列化为PaymentRequest对象之前 asp.net MVC4框架.

我的第一次尝试: 因为我现在已经理解了Request.Content.ReadAsStringAsync().结果什么也没有返回.这是因为内容只能读取一次.

我的第二次尝试: 我尝试将其序列化为JSON字符串.

var serializer = new JavaScriptSerializer();
var paymentRequestAsJson = serializer.Serialize(paymentRequest);
Run Code Online (Sandbox Code Playgroud)

这个问题是格式化与签名的正文部分略有不同.它具有相同的数据,但有一些空格.

我无法改变Put-method的调用者所做的事情,因为这是第三方组件.我该怎么办?

c# asp.net asp.net-web-api

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

.NET WebApi查看原始请求

我有一个

public void Post([FromBody]Record value)
Run Code Online (Sandbox Code Playgroud)

- 我可以用一些json从小提琴手那里打电话的方法.

当使用具有相同json的WizTools RESTClient 3.1从我的mac调用该方法时,value总是如此null.看起来它没有得到解析或其他东西.

我正在Content-Type: application/json两台机器上使用,我已经仔细检查Request.Content了Visual Studio调试器中的标头对象.

如果我使用一个只有2个属性的简单对象:

public class Test123 {
  public string name { get; set; }
  public int age { get; set; }
}

public void Post([FromBody]Test123 value)
Run Code Online (Sandbox Code Playgroud)

我可以从fiddler和mac中调用它,它value永远不会为null.

那么关于如何调试这个的任何提示?有没有办法让我看到从我的Mac发送到我的电脑上的iis/visual studio的原始响应?它不会出现在小提琴手中.

asp.net-web-api

3
推荐指数
1
解决办法
5940
查看次数

标签 统计

asp.net-web-api ×4

c# ×3

asp.net ×2

asp.net-core ×1

asp.net-mvc ×1