Как мне получить опубликованные данные в действии MVC?

#c# #asp.net-mvc #controller

#c# #asp.net-mvc #контроллер

Вопрос:

Я пытаюсь опубликовать некоторые данные в ASP.NET Действие контроллера MVC. В настоящее время я пытаюсь использовать WebClient.UploadData() для публикации нескольких параметров в моем действии.

Следующее попадет в действие, но все параметры равны нулю. Как можно получить опубликованные данные из http-запроса?

 string postFormat = "hwid={0}amp;label={1}amp;interchange={2}localization={3}";
var hwid = interchangeDocument.DocumentKey.Hwid;
var interchange = HttpUtility.UrlEncode(sw.ToString());
var label = ConfigurationManager.AppSettings["PreviewLabel"];
var localization = interchangeDocument.DocumentKey.Localization.ToString();

string postData = string.Format(postFormat, hwid, interchange, label, localization);

using(WebClient client = new WebClient())
{
   client.Encoding = Encoding.UTF8;
   client.Credentials = CredentialCache.DefaultNetworkCredentials;
   byte[] postArray = Encoding.ASCII.GetBytes(postData);
   client.Headers.Add("Content-Type", "pplication/x-www-form-urlencoded");
   byte[] reponseArray = client.UploadData("http://localhost:6355/SymptomTopics/BuildPreview",postArray);
   var result = Encoding.ASCII.GetString(reponseArray);
   return resu<
}
  

Вот действие, которое я вызываю

общедоступный ActionResult BuildPreview (строковый идентификатор, строковая метка, обмен строками, локализация строк) { … }

При достижении этого действия все параметры равны нулю.

Я пытался использовать WebClient.UploadValue() и передача данных в виде NameValueCollection. Этот метод всегда возвращает статус 500, и поскольку я делаю этот http-запрос из приложения MVC, я не могу найти способ исправить это.

Любая помощь в решении этой проблемы была бы очень полезной.

-Ник

Я исправил заголовок, чтобы читать:

 client.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
  

Теперь при загрузке данных сразу же возникают ошибки с ошибкой сервера 500.

Комментарии:

1. ваш тип контента выглядит нарушенным. Вам не хватает буквы «а» в начале pplication/x-www-form-urlencoded .

2. Спасибо.. итак, когда я исправляю свою опечатку UploadData (), просто ошибки с 500

3. Определены ли у вас какие-либо специальные маршруты?

4. Покажите нам сведения о 500 исключениях

5. Мой маршрут выглядит точно так: маршруты. MapRoute ( «BuildPreview», «SymptomTopics/BuildPreview/{hwid} /{label} / {localization}», новый {контроллер = «SymptomTopics», действие = «BuildPreview»});

Ответ №1:

Просто для смеха загляните в Request.Form и RouteData в свой контроллер, чтобы посмотреть, не попало ли там что-нибудь.

Комментарии:

1. Согласен, это должен быть принятый ответ. Вот пример для новичков: строка somethingFromAField = Request.Form.Get(«someTextField»); — «someTextField» взят из формы, которую мы только что отправили

Ответ №2:

Я смог получить XML-данные post из свойства Request objects InputStream.

       public ActionResult BuildPreview(string hwid, string label, string localization)
         {
             StreamReader streamReader = new StreamReader(Request.InputStream);
             XmlDocument xmlDocument = new XmlDocument();
             xmlDocument.LoadXml(streamReader.ReadToEnd());
               ... 

 }
  

Ответ №3:

В качестве временной меры вы всегда можете изменить действие вашего контроллера, чтобы оно принимало FormCollection параметр, а затем получить доступ к параметрам формы напрямую по имени.

Ответ №4:

Чтобы получить необработанные опубликованные байты из WebClient.UploadData("http://somewhere/BuildPreview", bytes)

 public ActionResult BuildPreview()
{
    byte[] b;
    using (MemoryStream ms = new MemoryStream())
    {
        Request.InputStream.CopyTo(ms);
        b = ms.ToArray();
    }

    ...
}