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.
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
Esta parece ser la manera de pagar XML a un controlador MVC
Cómo pasar XML como POST a un ActionResult en ASP MVC .NET
Traté de hacer que esto funcionara con la API WEB, pero no pude, así que tengo que usar el "Controlador" MVC.
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,
- Convierte los datos XML a un flujo y se adjunta al encabezado HTTP
- 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