Подтвердить что ты не робот

Как 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
4b9b3361

Ответ 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