首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何将XML发布到MVC控制器中?(而不是键/值)

如何将XML发布到MVC控制器中?(而不是键/值)
EN

Stack Overflow用户
提问于 2013-07-30 23:35:18
回答 3查看 19.7K关注 0票数 19

使用Fiddler,我可以在主体中传递

someXml=ThisShouldBeXml

然后在控制器中

代码语言:javascript
复制
    [HttpPost]
    public ActionResult Test(object someXml)
    {
        return Json(someXml);
    }

以字符串形式获取此数据

如何让fiddler将XML传递给MVC ActionController?如果我尝试将正文中的值设置为原始xml,则不起作用。

对于奖励积分,我如何在VBscript/Classic ASP中执行此操作?

我目前有

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

发布于 2013-07-31 05:17:56

这似乎是将XML付给MVC控制器的方法

How to pass XML as POST to an ActionResult in ASP MVC .NET

我试图让它与WEB API一起工作,但做不到,所以我不得不使用MVC 'Controller‘来代替它。

票数 3
EN

Stack Overflow用户

发布于 2018-04-26 21:59:32

MVC控制器对于这样的请求处理并不理想,但这就是我们的任务,所以让我们开始吧。让我们有一个我可以接受的XML:

代码语言:javascript
复制
<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>

我尝试了一些内置参数反序列化的解决方案,但似乎都不起作用,最后,我在方法体中反序列化了一个请求。我为它创建了一个辅助泛型类:

代码语言:javascript
复制
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);
        }
    }
}

我用xml属性修饰了我的DTO:

代码语言:javascript
复制
[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; }
}

并在一个控制器中使用了所有这些:

代码语言:javascript
复制
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();
            }
        }
    }
}

要使用它,只需发送一个请求,例如使用Postman。我正在使用上面提到的XML体向http://yourdomain.com/documents/sendDocument端点发送POST请求。值得一提的是头部。添加Content-Type:文本/xml,或请求工作。

而且它是有效的:

你可以在我的博客上看到完整的帖子:http://www.michalbialecki.com/2018/04/25/accept-xml-request-in-asp-net-mvc-controller/

票数 1
EN

Stack Overflow用户

发布于 2013-07-30 23:56:29

为了使用VBScript发送请求,我使用了WinHttp对象,即"WinHttp.WinHttpRequest.5.1“。

下面是我编写的一个函数,它发送您传入的XML请求并返回响应:

代码语言:javascript
复制
' -----------------------------------------
' 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
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17951384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档