Silverlight REST HttpWebRequest вызов: Прикрепить файл? - PullRequest
1 голос
/ 03 марта 2012

Что я хочу сделать, это сделать HTTP-сообщение на URL-адрес сервера (URL-адрес ASP.NET MVC) и отправить XML-файл с запросом. Я беспокоюсь (может быть, не должно быть?), Что если я просто вставлю строку XML в поток запроса, это может быть слишком длинным?

Я почти уверен, что был способ добавить сам файл в HttpWebRequest, а затем извлечь этот файл на стороне сервера.

Это сборка Silverlight, вызывающая URL-адрес ASP.NET MVC. Поэтому мне также нужно знать, как извлечь файл из MVC-запроса из запроса.

Thx

1 Ответ

3 голосов
/ 03 марта 2012

Я беспокоюсь (может быть, не должно быть?), Что если я просто вставлю 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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...