Тело запроса указывает, что встроенное программное обеспечение публикует многокомпонентные данные.И следующее content-disposition
означает, что он отправляет файл details.xml
:
------------------------------3cbec9ce8f05
Content-Disposition: form-data; name="ServerData"; filename="details.xml"
Content-Type: text/plain
Так что вам не нужно вручную удалять границу '------------------------------ 3cbec9ce8f05 'и Content-Type=...
. Просто используйте Request.Form.Files
.
Кроме того, как рекомендует @ ivan-valadares , вы можете использовать Модельный переплет для подъема тяжелых предметов.Но похоже, что он обрабатывает все тело запроса как строку, а затем создает XDocument
.Гораздо более элегантный способ - использовать XmlSerializer
для создания строго типизированного объекта.Кроме того, Интерфейс IModelBinder не имеет метода public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
.Вместо этого мы должны использовать BindModelAsync(ModelBindingContext bindingContext)
.
Поэтому создайте подшивку модели, как показано ниже:
public class EmbededServerDataBinder<T> : IModelBinder
{
public Task BindModelAsync(ModelBindingContext bindingContext)
{
if (bindingContext == null) { throw new ArgumentNullException(nameof(bindingContext)); }
var modelName = bindingContext.BinderModelName ?? "ServerData";
XmlSerializer serializer = new XmlSerializer(typeof(T));
var data= bindingContext.HttpContext.Request.Form.Files[modelName];
if(data == null){
bindingContext.ModelState.AddModelError(modelName,"invalid error");
return Task.CompletedTask;
}
using(var stream = data.OpenReadStream()){
var o = serializer.Deserialize(stream);
bindingContext.Result = ModelBindingResult.Success(o);
}
return Task.CompletedTask;
}
}
Теперь вы можете использовать ее в методе Action:
[HttpPost]
public IActionResult Post([ModelBinder(typeof(EmbededServerDataBinder<Ow_ServerModel>))] Ow_ServerModel ServerData)
{
return Ok("Working");
}
Обратите внимание, имя ServerData
имеет значение.Механизм связывания будет искать это имя в расположении содержимого.
Я проверяю его с вашей полезной нагрузкой, и оно работает для меня, как ожидалось: