2013-07-30 17 views
18

Korzystanie Skrzypek mogę przejść w organizmieJak POST XML do kontrolera MVC? (Zamiast klucza/wartość)

someXml = ThisShouldBeXml

a następnie w kontrolerze

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

pobiera te dane jako ciąg

Jak uzyskać skrzypka do przekazywania XML do MVC ActionController? Jeśli spróbuję ustawić wartość w treści jako surowy xml, to nie działa.

A co z punktami bonusowymi, jak to zrobić z VBscript/Classic ASP?

Obecnie mam

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

o czym ustawiłeś nagłówek Content-Type, kiedy próbujesz wysłać XML w treści? Pomocne może być zaktualizowanie pytania w celu pokazania wszystkiego na wysyłanej karcie Kompozytor. – EricLaw

+0

znalazłem odpowiedź ,, Potrzebowałem sposobu, aby przykleić kawałek XML w parę klucz/wartość i przy użyciu ActionFilter wydaje się działać. Teraz muszę tylko dowiedzieć się, jak analizować XML w klasycznej ASP .. – punkouter

Odpowiedz

-1

Aby wysłać żądanie za pomocą VBScript Użyłem obiekt winhttp czyli „WinHttp.WinHttpRequest.5.1”.

Poniżej znajduje się funkcja, która napisałem i to wysyła żądanie XML, które przepustkę i zwraca odpowiedź:

' ----------------------------------------- 
' 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 
+0

I zajrzał do tego WinHttp.WinHttpRequest.5.1, ale nie był pewien, jak go zainstalować. Mam już MSXML2.ServerXMLHTTP działającego ... jego po prostu muszę znaleźć sposób na przekazanie całego ciągu znaków XML do akcji POST i ograniczonego klucza/para wartości – punkouter

8

Nie można bezpośrednio przekazywać danych XML jako pliku do kontrolera MVC. Jedną z najlepszych metod jest przekazywanie danych XML jako Stream with HTTP post.

do wysyłania XML,

  1. Konwersja danych XML do Strumienia i dołączone do protokołu HTTP Header
  2. typ zawartości ustawiony na "text/xml; encoding = 'UTF-8'"

Patrz this stackoverflow post uzyskać więcej informacji na temat publikowania XML do MVC Controller

do pobierania XML w kontrolerze, stosuje się następującą metodę

[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

Aby przekazać dane jako żądło w MVC, należy utworzyć własny format formatowania nośnika, który będzie obsługiwał zwykły tekst. Następnie dodaj formatator do sekcji konfiguracji.

Aby użyć nowego formatyzatora, należy określić Content-Type dla tego formatyzatora, np. text/plain.formater

Próbka tekstu

metoda
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); 
     } 
    } 
} 

Kontroler:

[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 { }); 
} 

Ustawienia w metodzie WebApiConfig.cs Rejestracja:

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

Skrzypek nagłówki:

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

To jest metoda, która zadziałała dla mnie. –

Powiązane problemy