我正在尝试为我的ASP MVC项目提供一个简单的RESTful API。我将无法控制此API的客户端,它们将通过POST方法传递XML,该方法将包含在服务器端执行某些操作所需的信息,并向XML提供操作结果。我没有发回XML的问题,问题是通过POST接收XML。我已经看到了一些JSON示例,但是由于我将无法控制自己的客户端(从我的角度来看,它甚至可能是telnet),我认为JSON无法正常工作。我对么?
我看到了一些示例,其中客户只是将正确的表单格式构造为请求主体的一部分,然后ASP解析该消息,并且数据以FormCollection的形式提供(?param1 = value1&param2 = value2&etc)。但是,我想将纯XML作为消息正文的一部分传递。
谢谢你的帮助,
这可以通过使用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 }
希望这对其他人有帮助,如果您认为还有其他更优雅的方法,请告诉我。