I believe this is because you specified req.ContentType = "text/xml"; .
If I remember correctly when you define your controller using a "primitive" type ( string here is a "primitive" type)
public ActionResult Index(string xml){}
MVC will try to find xml either in the query string or in the published form data (html input field). But if you send something more complex to the server, MVC will transfer it to a specific class.
For example, when uploading multiple files to the server, you can accept them as follows in your controller
public ActionResult Index(IEnumerable<HttpPostedFileBase> files){}
Therefore, I assume that you should accept the text/xml stream in the controller using the correct class.
Update:
It seems that there is no such class because you are accepting a data stream (and this does not come from the input element). You can write your own binder to accept the XML document. See Discussions below.
Reading text / xml in ASP.MVC controller
How to pass XML as POST to ActionResult in ASP MVC.NET
erdinger
source share