Estoy tratando de publicar datos en la acción del controlador MVC, pero hasta ahora no han tenido éxito.¿Cómo publico datos en MVC Controller usando HttpWebRequest?
Aquí es la estructura de los datos de mensaje:
private string makeHttpPostString(XmlDocument interchangeFile)
{
string postDataString = "uid={0}&localization={1}&label={2}&interchangeDocument={3}";
InterchangeDocument interchangeDocument = new InterchangeDocument(interchangeFile);
using (var stringWriter = new StringWriter())
using (var xmlTextWriter = XmlWriter.Create(stringWriter))
{
interchangeFile.WriteTo(xmlTextWriter);
string interchangeXml = HttpUtility.UrlEncode(stringWriter.GetStringBuilder().ToString());
string hwid = interchangeDocument.DocumentKey.Hwid;
string localization = interchangeDocument.DocumentKey.Localization.ToString();
string label = ConfigurationManager.AppSettings["PreviewLabel"];
return (string.Format(postDataString, hwid, localization, label, interchangeXml));
}
}
Aquí está la solicitud:
HttpWebRequest webRequest = (HttpWebRequest) WebRequest.Create(controllerUrl);
webRequest.Method = "POST";
// webRequest.ContentType = "application/x-www-form-urlencoded";
string postData = makeHttpPostString(interchangeFile);
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
webRequest.ContentLength = byteArray.Length;
using (Stream dataStream = webRequest.GetRequestStream())
{
dataStream.Write(byteArray, 0, byteArray.Length);
}
HttpWebResponse webresponse = (HttpWebResponse) webRequest.GetResponse();
Cuando fijo el contenttype de la solicitud a "application/x-www-form- urlencoded "GetReponse() falla con el código de error 500 del servidor. Cuando lo comente y solo httpencode los datos xml," interchangeXml ", la publicación se envía pero solo el 3er parámetro," label "llega al controlador. Los otros son nulos.
¿Cuál es la forma correcta de publicar valores en una acción del controlador cuando uno de esos valores es xml data?
Gracias!
actualización
Soy enviar todos los parámetros con la excepción del XML a través de la cadena de consulta. Sin embargo, el problema ahora es que no sé cómo acceder a los datos publicados en la acción del controlador. ¿Puede alguien decirme cómo accedo al xml desde la HttpRequest desde mi Acción del controlador?
actualización
que han rediseñado el código anterior para utilizar el sugiere que me hizo Darin. Estoy recibiendo un error interno del servidor (500) usando WebClient UploadValues ().
Acción:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult BuildPreview(PreviewViewModel model)
{
...
}
Solicitud:
private string PostToSxController(XmlDocument interchangeFile, string controllerUrl)
{
var xmlInterchange = new InterchangeDocument(interchangeFile);
using (var client = new WebClient())
{
var values = new NameValueCollection()
{
{"uid", xmlInterchange.DocumentKey.Hwid},
{"localization", xmlInterchange.DocumentKey.Localization.ToString()},
{"label", ConfigurationManager.AppSettings["PreviewLabel"]},
{"interchangeDocument", interchangeFile.OuterXml }
};
byte[] result = null;
try
{
result = client.UploadValues(controllerUrl, values);
}
catch(WebException ex)
{
var errorResponse = ex.Response;
var errorMessage = ex.Message;
}
Encoding encoding = Encoding.UTF8;
return encoding.GetString(result);
}
}
Ruta:
routes.MapRoute(
"BuildPreview",
"SymptomTopics/BuildPreview/{model}",
new { controller = "SymptomTopics", action = "BuildPreview", model = UrlParameter.Optional }
);
¿Cuál es la estructura de datos de acciones de su MVC espera? ¿No podría simplemente publicar todos los datos en xml, a diferencia de la cadena de consulta? – Jay
La acción del controlador espera 4 cadenas: intercambioXml, hwid, localización y etiqueta. No ... el xml no contiene y no contendrá los otros valores que intento publicar. – Nick
¿Ha intentado utilizar una herramienta como Fiddler o Firebug para ver exactamente lo que su cliente está enviando al servidor? Puede que no esté saliendo correctamente. – Tridus