sesion net mvc iniciar autorización autenticación autenticacion asp xml asp.net-mvc fiddler

xml - iniciar - autenticación y autorización asp net mvc



¿Cómo POSTAR XML en el controlador MVC?(en lugar de clave/valor) (5)

El controlador MVC no es ideal para el manejo de solicitudes, pero esa fue la tarea, así que vamos a hacerlo. Tengamos un XML que yo acepte:

<document> <id>123456</id> <content>This is document that I posted...</content> <author>Michał Białecki</author> <links> <link>2345</link> <link>5678</link> </links> </document>

Probé algunas soluciones con deserialización de parámetros incorporados, pero ninguna parece funcionar y, finalmente, fui con la deserialización de una solicitud en el cuerpo del método. He creado una clase genérica auxiliar para ello:

public static class XmlHelper { public static T XmlDeserializeFromString<T>(string objectData) { var serializer = new XmlSerializer(typeof(T)); using (var reader = new StringReader(objectData)) { return (T)serializer.Deserialize(reader); } } }

Decoré mi DTO con atributos xml:

[XmlRoot(ElementName = "document", Namespace = "")] public class DocumentDto { [XmlElement(DataType = "string", ElementName = "id")] public string Id { get; set; } [XmlElement(DataType = "string", ElementName = "content")] public string Content { get; set; } [XmlElement(DataType = "string", ElementName = "author")] public string Author { get; set; } [XmlElement(ElementName = "links")] public LinkDto Links { get; set; } } public class LinkDto { [XmlElement(ElementName = "link")] public string[] Link { get; set; } }

Y usé todo eso en un controlador:

public class DocumentsController : Controller { // documents/sendDocument [HttpPost] public ActionResult SendDocument() { try { var requestContent = GetRequestContentAsString(); var document = XmlHelper.XmlDeserializeFromString<DocumentDto>(requestContent); return new HttpStatusCodeResult(HttpStatusCode.OK); } catch (System.Exception) { // logging return new HttpStatusCodeResult(HttpStatusCode.InternalServerError); } } private string GetRequestContentAsString() { using (var receiveStream = Request.InputStream) { using (var readStream = new StreamReader(receiveStream, Encoding.UTF8)) { return readStream.ReadToEnd(); } } } }

Para usarlo, simplemente envíe una solicitud usando, por ejemplo, Postman. Estoy enviando una solicitud POST a http://yourdomain.com/documents/sendDocument endpoint con el cuerpo xml mencionado anteriormente. Un detalle que vale la pena mencionar es un encabezado. Agregue Content-Type: text / xml, o solicite trabajar.

Y funciona:

Puedes ver la publicación completa en mi blog: http://www.michalbialecki.com/2018/04/25/accept-xml-request-in-asp-net-mvc-controller/

Usando Fiddler puedo pasar en el cuerpo.

someXml = ThisShouldBeXml

y luego en el controlador

[HttpPost] public ActionResult Test(object someXml) { return Json(someXml); }

obtiene estos datos como una cadena

¿Cómo puedo hacer que fiddler pase XML al MVC ActionController? Si intento establecer el valor en el cuerpo como xml sin procesar, no funciona.

Y para obtener puntos de bonificación, ¿cómo hago esto desde VBscript / Classic ASP?

Actualmente tengo

DataToSend = "name=JohnSmith" Dim xml Set xml = server.Createobject("MSXML2.ServerXMLHTTP") xml.Open "POST", _ "http://localhost:1303/Home/Test", _ False xml.setRequestHeader "Content-Type", "application/x-www-form-urlencoded" xml.send DataToSend



No puede pasar directamente datos XML como archivo al controlador MVC. Uno de los mejores métodos es pasar datos XML como Stream con HTTP post.

Para publicar XML,

  1. Convierte los datos XML a un flujo y se adjunta al encabezado HTTP
  2. Establezca el tipo de contenido en "text / xml; encoding = ''utf-8''"

Consulte esta publicación de para obtener más detalles sobre la publicación de XML en MVC Controller.

Para recuperar XML en el controlador, use el siguiente método

[HttpPost] public ActionResult Index() { HttpWebResponse response = (HttpWebResponse)request.GetResponse(); if (response.StatusCode == HttpStatusCode.OK) { // as XML: deserialize into your own object or parse as you wish var responseXml = XDocument.Load(response.GetResponseStream()); //in responseXml variable you will get the XML data } }


Para enviar la solicitud utilizando VBScript, he utilizado el objeto WinHttp, es decir, "WinHttp.WinHttpRequest.5.1".

A continuación se muestra una función que escribí y esto envía la solicitud XML que usted pasa y devuelve la respuesta:

'' ----------------------------------------- '' Method: sendRequest() '' Descrip: send the web service request as SOAP msg '' ----------------------------------------- Public Function sendRequest(p_SOAPRequest) Const METHOD_NAME = "sendRequest()" Dim objWinHttp Dim strResponse Dim URL URL = "http:someURL.com" Const WINHTTP_OPTION_SECURITY_FLAGS = 13056 ''13056: Ignores all SSL Related errors Const WinHttpRequestOption_SslErrorIgnoreFlags = 4 ''http://msdn.microsoft.com/en-us/library/Aa384108 Set objWinHttp = CreateObject("WinHttp.WinHttpRequest.5.1") ''Open HTTP connection Call objWinHttp.Open("POST", URL, False) ''Set request headers Call objWinHttp.setRequestHeader("Content-Type", m_CONTENT_TYPE) Call objWinHttp.setRequestHeader("SOAPAction", URL) ''Ignore the requirement for a security certificate: ''http://msdn.microsoft.com/en-us/library/windows/desktop/aa384086(v=vs.85).aspx objWinHttp.Option(WinHttpRequestOption_SslErrorIgnoreFlags) = WINHTTP_OPTION_SECURITY_FLAGS ''Send SOAP request On Error Resume Next objWinHttp.Send p_SOAPRequest If Err Then m_objLogger.error(METHOD_NAME & " error " & Err.Number & ": " & Err.Description) Err.Clear End If ''disable error handling On Error GoTo 0 ''Get XML Response strResponse = objWinHttp.ResponseText ''cleanup Set objWinHttp = Nothing sendRequest = strResponse End Function


Para pasar los datos como una trampa en MVC, debe crear su propio formateador de tipo de medios para manejar texto sin formato. Luego agregue el formateador a la sección de configuración.

Para usar el nuevo formateador, especifique el tipo de contenido para ese formateador, como text / plain .

Formato de muestra para texto.

using System; using System.Net.Http.Formatting; using System.Net.Http.Headers; using System.Threading.Tasks; using System.IO; using System.Text; namespace SampleMVC.MediaTypeFormatters { public class TextMediaTypeFormmatter : XmlMediaTypeFormatter { private const int ByteChunk = 1024; private UTF8Encoding StringEncoder = new UTF8Encoding(); public TextMediaTypeFormmatter() { base.UseXmlSerializer = true; SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/plain")); } public override bool CanReadType(Type type) { if (type == typeof(string)) { return true; } return false; } public override bool CanWriteType(Type type) { if (type == typeof(string)) { return true; } return false; } public override Task<object> ReadFromStreamAsync(Type type, Stream readStream, System.Net.Http.HttpContent content, IFormatterLogger formatterLogger) { StringBuilder StringData = new StringBuilder(); byte[] StringBuffer = new byte[ByteChunk]; int BytesRead = 0; Task<int> BytesReadTask = readStream.ReadAsync(StringBuffer, 0, ByteChunk); BytesReadTask.Wait(); BytesRead = BytesReadTask.Result; while (BytesRead != 0) { StringData.Append(StringEncoder.GetString(StringBuffer, 0, BytesRead)); BytesReadTask = readStream.ReadAsync(StringBuffer, 0, ByteChunk); BytesReadTask.Wait(); BytesRead = BytesReadTask.Result; } return Task<object>.Run(() => BuilderToString(StringData)); } private object BuilderToString(StringBuilder StringData) { return StringData.ToString(); } public override Task WriteToStreamAsync(Type type, object value, Stream writeStream, System.Net.Http.HttpContent content, System.Net.TransportContext transportContext) { byte[] StringBuffer = StringEncoder.GetBytes((string)value); return writeStream.WriteAsync(StringBuffer, 0, StringBuffer.Length); } } }

Método del controlador:

[HttpPost] public async Task<HttpResponseMessage> UsingString([FromBody]string XmlAsString) { if (XmlAsString == null) { return this.Request.CreateResponse(HttpStatusCode.BadRequest); } return this.Request.CreateResponse(HttpStatusCode.OK, new { }); }

Configuración en el método de registro WebApiConfig.cs:

config.Formatters.Add(new TextMediaTypeFormmatter());

Encabezados de violinista:

User-Agent: Fiddler Content-Type: text/plain