一尘不染

如何将XML作为POST传递给ASP MVC .NET中的ActionResult

json

我正在尝试为我的ASP MVC项目提供一个简单的RESTful
API。我将无法控制此API的客户端,它们将通过POST方法传递XML,该方法将包含在服务器端执行某些操作所需的信息,并向XML提供操作结果。我没有发回XML的问题,问题是通过POST接收XML。我已经看到了一些JSON示例,但是由于我将无法控制自己的客户端(从我的角度来看,它甚至可能是telnet),我认为JSON无法正常工作。我对么?

我看到了一些示例,其中客户只是将正确的表单格式构造为请求主体的一部分,然后ASP解析该消息,并且数据以FormCollection的形式提供(?param1
= value1&param2 = value2&etc)。但是,我想将纯XML作为消息正文的一部分传递。

谢谢你的帮助,


阅读 313

收藏
2020-07-27

共1个答案

一尘不染

这可以通过使用ActionFilterAttribute来完成。动作过滤器基本上在动作结果之前或之后与请求相交。因此,我只是为POST操作结果构建了一个自定义操作过滤器属性。这是我所做的:

public class RestAPIAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        HttpContextBase httpContext = filterContext.HttpContext;
        if (!httpContext.IsPostNotification)
        {
            throw new InvalidOperationException("Only POST messages allowed on this resource");
        }
        Stream httpBodyStream = httpContext.Request.InputStream;

        if (httpBodyStream.Length > int.MaxValue)
        {
            throw new ArgumentException("HTTP InputStream too large.");
        }

        int streamLength = Convert.ToInt32(httpBodyStream.Length);
        byte[] byteArray = new byte[streamLength];
        const int startAt = 0;

        /*
         * Copies the stream into a byte array
         */
        httpBodyStream.Read(byteArray, startAt, streamLength);

        /*
         * Convert the byte array into a string
         */
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < streamLength; i++)
        {
            sb.Append(Convert.ToChar(byteArray[i]));
        }

        string xmlBody = sb.ToString();

        //Sends XML Data To Model so it could be available on the ActionResult

        base.OnActionExecuting(filterContext);
    }
}

然后在控制器上的操作结果方法上,您应该执行以下操作:

    [RestAPIAttribute]
    public ActionResult MyActionResult()
    {
        //Gets XML Data From Model and do whatever you want to do with it
    }

希望这对其他人有帮助,如果您认为还有其他更优雅的方法,请告诉我。

2020-07-27