Я беспокоюсь (может быть, не должно быть?), Что если я просто вставлю XML
строка в потоке запроса может быть слишком длинной?
По этой причине вы должны использовать глагол POST вместо GET.
На стороне клиента вы можете использовать WebRequest и записать полезную нагрузку XML непосредственно в поток запросов:
var request = WebRequest.CreateHttp("http://localhost:1398/home/upload");
request.Method = "POST";
request.BeginGetRequestStream(ar =>
{
var r = (HttpWebRequest)ar.AsyncState;
// create some XML document to send to the server
var doc = XDocument.Parse("<root>Value</root>");
using (var stream = r.EndGetRequestStream(ar))
{
doc.Save(stream);
}
r.BeginGetResponse(asyncState =>
{
var req = (HttpWebRequest)asyncState.AsyncState;
using (var response = req.EndGetResponse(asyncState))
using (var responseStream = response.GetResponseStream())
using (var reader = new StreamReader(responseStream))
{
var result = reader.ReadToEnd();
// TODO: do something with the server response
Dispatcher.BeginInvoke(() =>
{
textBlock.Text = result;
});
}
}, r);
}, request);
и на стороне сервера вы можете иметь контроллер:
public class HomeController : Controller
{
[HttpPost]
public ActionResult Upload(XDocument xdoc)
{
...
}
}
и пользовательская привязка модели для типа XDocument:
public class XDocumentModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
return XDocument.Load(controllerContext.HttpContext.Request.InputStream);
}
}
, который будет зарегистрирован в Application_Start
:
ModelBinders.Binders.Add(typeof(XDocument), new XDocumentModelBinder());