Как POST XML в MVC-контроллер? (вместо ключа/значения)
Используя Fiddler, я могу пройти в теле
someXml = ThisShouldBeXml
а затем в контроллере
[HttpPost]
public ActionResult Test(object someXml)
{
return Json(someXml);
}
получает эти данные в виде строки
Как мне заставить скрипач передать XML в MVC ActionController? Если я попытаюсь установить значение в теле как raw xml, это не сработает.
И для бонусных очков, как это сделать из VBscript/Classic ASP?
В настоящее время у меня
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
Ответы
Ответ 1
Вы не можете напрямую передавать XML-данные в файл в контроллер MVC. Один из лучших способов - передать XML-данные как Stream с HTTP-сообщением.
Для публикации XML
- Преобразование данных XML в поток и присоединение к заголовку HTTP
- Задайте тип содержимого "text/xml; encoding = 'utf-8"
Обратитесь к fooobar.com/questions/218283/... для получения более подробной информации о отправке XML в MVC-контроллер
Для извлечения XML в контроллере используйте следующий метод
[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
}
}
Ответ 2
Это, по-видимому, способ оплаты XML контроллеру MVC
Как передать XML как POST в ActionResult в ASP MVC.NET
Я попытался заставить это работать с WEB API, но не мог, поэтому мне пришлось использовать MVC 'Controller'.
Ответ 3
Чтобы передать данные в качестве жало в MVC, вам нужно создать свой собственный формат форматов для обработки простого текста. Затем добавьте форматтер в раздел конфигурации.
Чтобы использовать новый форматтер, укажите Content-Type для этого форматирования, например
текст/равнину.
Пример форматирования для текста
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);
}
}
}
Метод контроллера:
[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 { });
}
Настройка метода регистрации WebApiConfig.cs:
config.Formatters.Add(new TextMediaTypeFormmatter());
Заголовки Fiddler:
User-Agent: Fiddler
Content-Type: text/plain
Ответ 4
Чтобы отправить запрос с помощью VBScript, я использовал объект WinHttp, т.е. "WinHttp.WinHttpRequest.5.1".
Ниже приведена функция, которую я написал, и это отправляет XML-запрос, который вы передаете, и возвращает ответ:
' -----------------------------------------
' 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