Способ иметь отдельную реализацию выглядит следующим образом.
//inner_foo.h
template <typename T>
struct Foo
{
void doSomething(T param);
};
//foo.tpp
#include "inner_foo.h"
template <typename T>
void Foo<T>::doSomething(T param)
{
//implementation
}
//foo.h
#include <foo.tpp>
//main.cpp
#include <foo.h>
inner_foo имеет форвардные объявления. foo.tpp имеет реализацию и включает inner_foo.h; и foo.h будет иметь только одну строку, чтобы включить foo.tpp.
Во время компиляции содержимое foo.h копируется в foo.tpp, а затем весь файл копируется в foo.h после который он компилирует. Таким образом, ограничений нет, и именование согласовано в обмен на один дополнительный файл.
Я делаю это, потому что статические анализаторы для кода разбиваются, когда он не видит передовые объявления класса в * .tpp. Это раздражает при написании кода в любой среде IDE или с помощью YouCompleteMe или других.
Вы также можете перемотать внутри контроллера, если хотите:
if (request?.ContentLength != null)
{
request.EnableRewind();
request.Body.Seek(0, SeekOrigin.Begin);
using (var reader = new StreamReader(request.Body, Encoding.UTF8))
{
body = reader.ReadToEnd();
//Do your thing with the body content
}
}
Эта ошибка возникает, если вы не добавили этот атрибут поверх метода действия вашего контроллера. Это используется для отключения привязки модели значения формы здесь, чтобы взять на себя управление обработкой потенциально больших файлов.
[DisableFormValueModelBinding]
blockquote>
Итак, я нашел обходной путь - включить перемотку HttpRequest. Для этого мне нужно было добавить этот фрагмент кода в Startup.cs
:
app.Use(async (context, next) => {
context.Request.EnableRewind();
await next();
});
Таким образом, исключение UnexpectedEndOfStream не будет выброшено, поскольку поток можно перематывать.
Вы можете загрузить данные, используя файл контроля доступа, принимая во внимание, что файл имеет общедоступный URL-адрес.
var webRequest = HttpWebRequest.Create(url);
using (var webResponse = webRequest.GetResponse())
{
var file_size = webResponse.Headers.Get("Content-Length");
var file_name = webResponse.ResponseUri.Segments.Last();
}