6

How do I read text/xml into an action on a ASP.MVC Controller?

I have a web application that may receive POSTed Xml from two different sources so the contents of the Xml may be different.

I want the default action on my controler to be able to read the Xml however I am struggling to see how I can get the Xml into the action in the first place.

If the Xml was consistent I could have used a Model Binder but thats not possible here.

Shady
  • 91
  • 2
  • 3

1 Answers1

14

You could read it from the request stream:

[HttpPost]
public ActionResult Foo()
{
    using (var reader = new StreamReader(Request.InputStream))
    {
        string xml = reader.ReadToEnd();
        // process the XML
        ...
    }
}

and to cleanup this action you could write a custom model binder for a XDocument:

public class XDocumentModeBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        return XDocument.Load(controllerContext.HttpContext.Request.InputStream);
    }
}

which you would register in Application_Start:

ModelBinders.Binders.Add(typeof(XDocument), new XDocumentModeBinder());

and finally:

[HttpPost]
public ActionResult Foo(XDocument doc)
{
    // process the XML
    ...
}

which is obviously cleaner.

Darin Dimitrov
  • 1,023,142
  • 271
  • 3,287
  • 2,928
  • This is a fine solution to limit input to XML but if one does that nothing that doesn't parse as valid XML would pass. Personally, I would rather have it to accept any string than do the parsing in the action (via some Utility class or something) and as such maybe be able to provide better details to the user if something went wrong. – mare Jul 05 '11 at 12:20
  • It all depends on what the exact use case is. The custom model binder saves a lot of plumbing code if a valid XML is needed anyhow. Works well in my case, thanks for sharing. – vbocan Oct 25 '13 at 13:56