2013-07-30 19 views
18

Sử dụng Fiddler tôi có thể vượt qua trong cơ thểLàm thế nào để POST XML vào Bộ điều khiển MVC? (Thay vì chìa khóa/giá trị)

someXml = ThisShouldBeXml

và sau đó trong bộ điều khiển

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

nhận dữ liệu này như là một chuỗi

Làm thế nào để tôi nhận được fiddler để vượt qua XML để MVC ActionController? Nếu tôi thử đặt giá trị trong phần thân là xml thô, nó không hoạt động ..

Và điểm thưởng làm cách nào để làm điều này từ VBScript/ASP cổ điển?

Tôi hiện đang có

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

bạn đã đặt tiêu đề Loại nội dung của mình thành gì khi bạn đang cố gửi XML trong nội dung? Nó có thể hữu ích nếu bạn cập nhật câu hỏi của mình để hiển thị mọi thứ trong tab Trình soạn thảo mà bạn đang gửi. – EricLaw

+0

tìm thấy câu trả lời, tôi cần một cách để dính một đoạn XML vào cặp khóa/giá trị và sử dụng ActionFilter dường như hoạt động .. Bây giờ tôi chỉ cần tìm ra cách phân tích cú pháp XML trong ASP cổ điển .. – punkouter

Trả lời

-1

Để gửi yêu cầu sử dụng VBScript Tôi đã sử dụng các đối tượng Winhttp tức là "WinHttp.WinHttpRequest.5.1".

Dưới đây là một chức năng mà tôi đã viết và điều này gửi yêu cầu XML mà bạn vượt qua trong và trả về phản ứng:

' ----------------------------------------- 
' 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 nhìn vào đó WinHttp.WinHttpRequest.5.1 nhưng không chắc chắn làm thế nào để cài đặt nó .. Tôi đã có MSXML2.ServerXMLHTTP làm việc .. nó chỉ cần tôi tìm một cách để vượt qua một chuỗi toàn bộ XML để hành động POST và khóa giới hạn/cặp giá trị – punkouter

8

Bạn không thể chuyển trực tiếp dữ liệu XML dưới dạng tệp tới bộ điều khiển MVC. Một trong những phương pháp tốt nhất là truyền dữ liệu XML dưới dạng Luồng với bài đăng HTTP.

Đối với Đăng XML,

  1. Chuyển đổi dữ liệu XML để một Stream và gắn liền với HTTP Header
  2. loại Set nội dung để "text/xml; encoding = 'utf-8'"

Tham khảo this stackoverflow post để biết thêm chi tiết về cách đăng XML lên Bộ điều khiển MVC

Để truy xuất XML trong bộ điều khiển, sử dụng phương pháp sau

[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

Để chuyển dữ liệu dưới dạng sting trong MVC, bạn phải tạo trình định dạng kiểu phương tiện của riêng mình để xử lý văn bản thuần. Sau đó thêm trình định dạng vào phần cấu hình.

Để sử dụng trình định dạng mới chỉ định Loại nội dung cho trình định dạng đó, như văn bản/đồng bằng.formatter

mẫu cho văn bản

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

điều khiển phương pháp:

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

cài đặt trong phương pháp WebApiConfig.cs Đăng ký:

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

Fiddler tiêu đề:

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

Đây là phương pháp làm việc cho tôi. –

Các vấn đề liên quan