Читать тело запроса в ASP.NET -- asp.net поле с участием rest поле с участием httpwebrequest пол Связанный проблема

Read Request Body in ASP.NET


12
vote

проблема

русский

Как можно прочитать тело запроса в ASP.NET? Я использую дополнение клиента покоя для Firefox, чтобы сформировать запрос на получение ресурса на сайте, который я просаживаюсь на месте, а в телу запроса я просто кладу строку «тест», чтобы попытаться прочитать его сервер.

в сервере кода (который является очень простым действием MVC), у меня есть следующее:

 <код> var reader = new StreamReader(Request.InputStream); var inputString = reader.ReadToEnd();   

Но когда я отладку в него, <код> inputString всегда пусто. Я не уверен, как еще (например, в Firebug) подтвердить, что тело запроса действительно отправляется должным образом, я думаю, что я просто предполагаю, что дополнение это правильно. Может быть, я неправильно читаю значение?

Английский оригинал

How does one read the request body in ASP.NET? I'm using the REST Client add-on for Firefox to form a GET request for a resource on a site I'm hosting locally, and in the Request Body I'm just putting the string "test" to try to read it on the server.

In the server code (which is a very simple MVC action) I have this:

var reader = new StreamReader(Request.InputStream); var inputString = reader.ReadToEnd(); 

But when I debug into it, inputString is always empty. I'm not sure how else (such as in FireBug) to confirm that the request body is indeed being sent properly, I guess I'm just assuming that the add-on is doing that correctly. Maybe I'm reading the value incorrectly?

</div
        
       
       

Список ответов

4
 
vote
vote
Лучший ответ
 

Может быть, я неправильно прозвучаю свое обучение, но я думаю, что получите запросы на самом деле имеют тело . Эта страница .

Характеристики HTML технически определяют разницу между «GET» и «POST», чтобы прежние средства означают, что данные формы должны быть закодированы (браузером) в URL, в то время как последнее означает, что данные формы должны появиться в Тело сообщения.

Так, может быть, вы делаете вещи правильно, но вы должны публиковать данные, чтобы иметь сообщение для сообщения?

Обновление

В ответ на ваш комментарий, самый «правильный» спокойный путь будет отправлять каждое из значений в качестве собственного параметра:

 <код> site.com/MyController/MyAction?id=1&id=2&id=3...   

Тогда ваше действие будет автоматически связать эти, если вы даете ему параметр массива одним и тем же именем:

 <код> public ActionResult MyAction(int[] id) {...}   

Или, если вы Masochist, вы можете, возможно, попробуйте потянуть значения из <код> Request.QueryString один за раз.

 

Maybe I'm misremembering my schooling, but I think GET requests don't actually have a body. This page states.

The HTML specifications technically define the difference between "GET" and "POST" so that former means that form data is to be encoded (by a browser) into a URL while the latter means that the form data is to appear within a message body.

So maybe you're doing things correctly, but you have to POST data in order to have a message body?

Update

In response to your comment, the most "correct" RESTful way would be to send each of the values as its own parameter:

site.com/MyController/MyAction?id=1&id=2&id=3... 

Then your action will auto-bind these if you give it an array parameter by the same name:

public ActionResult MyAction(int[] id) {...} 

Or if you're a masochist you can maybe try pulling the values out of Request.QueryString one at a time.

</div
 
 
       
       
2
 
vote

Я недавно напомнил об этом старом вопросе и хотел добавить еще один ответ на полноту на основе более поздних реализаций в моей собственной работе.

для справки, Я блогировал на тему недавно.

По сути, сердце этого вопроса было: «Как я могу пройти большие и более сложные критерии поиска ресурса, чтобы получить фильтрованный список объектов?» И он закончил кипятить до двух вариантов:

  1. Куча Получить параметры строки запроса
  2. Сообщение с DTO по запросу Тело

Первый вариант не идеален, поскольку реализация некрасина, и URL, скорее всего, превысит максимальную длину в какой-то момент. Второй вариант, в то время как функционал, просто не сидил со мной в «спокойном» смысле. В конце концов, я Получение данных , верно?

Однако имейте в виду, что я не просто получать данные. Я создание список объектов. Каждый объект уже существует, но сам список не. Это совершенно новая вещь, созданная путем выдачи критериев поиска / фильтра к полной репозитории объектов на сервере. (В конце концов, помните, что набор объектов все еще, сама, объект.)

Это чисто семантическая разница, но решительно важная. Потому что, в самом простом, это означает, что я могу удобно использовать пост для выдачи этих критериев поиска на сервере. Ответ - это данные, которые я получаю, поэтому я «получаю» данные. Но я не «получаю» данные в том смысле, что я на самом деле выполняю акт создания, создавая новый экземпляр списка объектов, который будет состоит из ранее существующих элементов.

Я полностью признаю, что ограничение никогда не было техническим, это было просто семантическим. Это просто никогда не «села вправо» со мной. Нетехническая проблема требует нетехнического решения, в данном случае семантический. Глядя на проблему с слегка разной семантической точки зрения, привело к значительному очищенному раствору, что оказало решение, которое я оказался в первую очередь.

 

I was recently reminded of this old question, and wanted to add another answer for completeness based on more recent implementations in my own work.

For reference, I've blogged on the subject recently.

Essentially, the heart of this question was, "How can I pass larger and more complex search criteria to a resource to GET a filtered list of objects?" And it ended up boiling down to two choices:

  1. A bunch of GET query string parameters
  2. A POST with a DTO in the request body

The first option isn't ideal, because implementation is ugly and the URL will likely exceed a maximum length at some point. The second option, while functional, just didn't sit right with me in a "RESTful" sense. After all, I'm GETting data, right?

However, keep in mind that I'm not just GETting data. I'm creating a list of objects. Each object already exists, but the list itself doesn't. It's a brand new thing, created by issuing search/filter criteria to the complete repository of objects on the server. (After all, remember that a collection of objects is still, itself, an object.)

It's a purely semantic difference, but a decidedly important one. Because, at its simplest, it means I can comfortably use POST to issue these search criteria to the server. The response is data which I receive, so I'm "getting" data. But I'm not "GETting" data in the sense that I'm actually performing an act of creation, creating a new instance of a list of objects which happens to be composed of pre-existing elements.

I'll fully admit that the limitation was never technical, it was just semantic. It just never "sat right" with me. A non-technical problem demands a non-technical solution, in this case a semantic one. Looking at the problem from a slightly different semantic viewpoint resulted in a much cleaner solution, which happened to be the solution I ended up using in the first place.

</div
 
 
1
 
vote

Помимо вопроса Get / Post, я обнаружил, что вам нужно установить запрос. inputStream позиция обратно к началу. Благодаря Этот ответ I найден.

специально комментарий

request.InputStream // Обязательно сбросить положение после прочтения или поздних чтений может потерпеть неудачу

Что я перевел в

 <код> Request.InputStream.Seek(0,0)   
 

Aside from the GET/POST issue, I did discover that you need to set the Request.InputStream position back to the start. Thanks to this answer I found.

Specifically the comment

Request.InputStream // make sure to reset the Position after reading or later reads may fail

Which I translated into

Request.InputStream.Seek(0,0) 
</div
 
 
0
 
vote

Я бы попробую использовать httpClient (доступно через Nuget) для выполнения этого типа. Это намного проще, чем объекты System.net

 

I would try using the HttpClient (available via Nuget) for doing this type of thing. Its so much easier than the System.Net objects

</div
 
 
0
 
vote

Прямое чтение из запроса. Впустую постригация опасно, потому что при повторном чтении получат нуль, даже если данные существуют. Это подтверждено на практике. Надежное чтение выполняется следующим образом:

 <код> /*Returns a string representing the content of the body  of the HTTP-request.*/ public static string GetFromBodyString(this HttpRequestBase request) {     string result = string.Empty;      if (request == null || request.InputStream == null)         return result;      request.InputStream.Position = 0;      /*create a new thread in the memory to save the original      source form as may be required to read many of the      body of the current HTTP- request*/     using (MemoryStream memoryStream = new MemoryStream())     {         request.InputStream.CopyToMemoryStream(memoryStream);         using (StreamReader streamReader = new StreamReader(memoryStream))         {             result = streamReader.ReadToEnd();         }     }     return result; }  /*Copies bytes from the given stream MemoryStream and writes  them to another stream.*/ public static void CopyToMemoryStream(this Stream source, MemoryStream destination) {     if (source.CanSeek)     {         int pos = (int)destination.Position;         int length = (int)(source.Length - source.Position) + pos;         destination.SetLength(length);          while (pos < length)             pos += source.Read(destination.GetBuffer(), pos, length - pos);     }     else         source.CopyTo((Stream)destination); }   
 

Direct reading from the Request.InputStream dangerous because when re-reading will get null even if the data exists. This is verified in practice. Reliable reading is performed as follows:

/*Returns a string representing the content of the body  of the HTTP-request.*/ public static string GetFromBodyString(this HttpRequestBase request) {     string result = string.Empty;      if (request == null || request.InputStream == null)         return result;      request.InputStream.Position = 0;      /*create a new thread in the memory to save the original      source form as may be required to read many of the      body of the current HTTP- request*/     using (MemoryStream memoryStream = new MemoryStream())     {         request.InputStream.CopyToMemoryStream(memoryStream);         using (StreamReader streamReader = new StreamReader(memoryStream))         {             result = streamReader.ReadToEnd();         }     }     return result; }  /*Copies bytes from the given stream MemoryStream and writes  them to another stream.*/ public static void CopyToMemoryStream(this Stream source, MemoryStream destination) {     if (source.CanSeek)     {         int pos = (int)destination.Position;         int length = (int)(source.Length - source.Position) + pos;         destination.SetLength(length);          while (pos < length)             pos += source.Read(destination.GetBuffer(), pos, length - pos);     }     else         source.CopyTo((Stream)destination); } 
</div
 
 

Связанный проблема

1  Лучший способ получить все даты между datea и dateb  ( Best way to get all dates between datea and dateb ) 
Я использую ASP: Calander, и у меня есть объект, который имеет дату начала и дату окончания. Мне нужно получить все даты между этими двумя датами и размещать ...

4  Как генерировать документ Word (DOC, DOCX) в ASP.NET? [закрыто]  ( How to generate word documentdoc docx in asp net ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> закрыт . Этот вопрос должен быть больше Фокусированный . В настоя...

0  Удалите подстроку из строки в jQuery [дублировать]  ( Remove a substring from a string in jquery ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> Этот вопрос уже есть ответы здесь : ...

1  ASP.NET Печать PDF непосредственно к принтеру с настройками  ( Asp net print pdf directly to printer with preferences ) 
Я работаю над проектом, который требует от нас отправлять PDFS на печатную прессу. Ранее мы сделали это с помощью настольного приложения и Acrobat, но я хотел...

3  ASP.NET/ADO.NET: обработка многих соединений базы данных внутри объекта .NET?  ( Asp net ado net handling many database connections inside a net object ) 
У нас есть объект .NET, который делает много чтения / записи с базой данных. В течение всего жизненного цикла этого объекта (или страницы ASP, которая ее испо...

0  1002 Ошибка API Вызов PayPal Sandbox  ( 1002 error api call paypal sandbox ) 
Я создал учетную запись PayPal Sandbox, и создал пользователь, и у меня есть все учетные данные, осмотр этого правильных учетных данных, которые он несколько ...

1  Формация не работает  ( Formauthentication not working ) 
Я делаю сайт в ASP.NET MVC. К сожалению, <код> FormsAuthentication.SetAuthCookie(login.Username, login.RememberMe); , похоже, не работает должным образом. <...

5  Можем ли мы использовать ответ .Flush () вместо ответа. Денды ()  ( Can we use response flush instead of response end ) 
<Код> Response.End() генерирует <код> ThreadAbortException . Использование <код> HttpContext.Current.ApplicationInstance.CompleteRequest вместо этого не р...

0  Как изменить HTML-вид контроля веб-пользователей  ( How to change html view of web user control ) 
Я создаю веб-пользователь для простого опроса. В настоящее время я регистрируюсь на странице, а затем ссылаюсь на него через TACPPREFIX. Форма для опроса на...

4  Создайте VCARD, который можно скачать на Android с помощью ASP.NET  ( Generate vcard that can be downloaded on android using asp net ) 
Я пробую довольно некоторое время, чтобы сгенерировать VCARD, используя ASP.NET (C #), которые можно загрузить на устройство Android. Процесс генерации карт...

2  Получение моего контроля меню ASP для игнорирования узла XML  ( Getting my asp menu control to ignore an xml node ) 
Я пытаюсь заполнить контроль меню ASP: меню с помощью файла XML. Я хочу, чтобы узел меню отображается горизонтально по всему элементу управления в статическом...

3  ASP.NET и WCF RIA Услуги  ( Asp net and wcf ria services ) 
имеет смысл использовать asp.net приложений (или приложений, которые представляют собой MICKure of asp.net и silverlight ) вместе с WCF RIA Services ? ...

2  Компиляция страницы ASPX не удается  ( Aspx page compilation fails ) 
Мы разрабатываем веб-приложение, которое позволяет администраторам загружать плагины. Все плагины хранятся в специальной папке вне корня приложения (скажем, C...

0  Как загрузить каталог на FTP, используя ftplib?  ( How to upload directory to ftp using ftplib ) 
У меня проблемы с загрузкой Все файлы на FTP: я использую ftplib . У меня есть функция для загрузки: <код> Proj executable not found. Please set PROJ_DIR v...

0  Как я могу прочитать, что является URL-адресом назначения, когда требуется перенаправление?  ( How can i read what the destination url is when a redirect is requested ) 
Я использую <код> MasterPage с панелью динамической меню по всей странице. Если пользователь запросил перенаправить обратно на страницу входа в систему (HOME...




© 2021 www.qaru.top All Rights Reserved. Q&A House все права защищены


Licensed under cc by-sa 3.0 with attribution required.