我有一些 ASP.NET 中间件,可以分析传入的请求。根据其中可用的内容HttpRequest,我想添加一个可以在代码中使用的自定义属性。我的问题是,有没有办法添加属性HttpRequest以便我可以在控制器中访问它?例如,在我的 中Controller,我想做这样的事情:
namespace MyWebsite.Controllers
{
public class MyController : Controller
public IActionResult Index()
{
if (this.Request.MyProperty == null)
{
return View("~/Views/NoExist.cshtml");
}
return View ("/Views/Index.cshtml");
}
}
Run Code Online (Sandbox Code Playgroud)
MyProperty表示我想通过自定义中间件注入或添加的自定义属性。这可能吗?如果是这样,怎么办?如果不是,推荐的方法是什么?
谢谢你!
我正在使用 nextjs,我想上传一个文件,所以我使用 next-connect 来使用 multer
import nc from "next-connect";
import multer from "multer";
export const config = {
api: {
bodyParser: false,
},
}
const upload = multer({ dest: `${__dirname}../../public` });
const handler = nc()
.use(upload.single('image'))
.post(async (req, res)=>{
console.log(req.body); // undefined
console.log(req.file); // undefined
res.status(200).send("yo");
})
export default handler;
Run Code Online (Sandbox Code Playgroud)
这是客户端代码:
function handleOnSubmit(e){
e.preventDefault();
const data = {};
var formData = new FormData(e.target);
for (const [name,value] of formData) {
data[name] = value;
}
data.type = data.type[0].toUpperCase();
data.name = data.name[0].toUpperCase();
axios({ …Run Code Online (Sandbox Code Playgroud) 我想在页面加载之前将某些用户组重定向到另一个 URL(外部),即使用中间件。
由于我在 ssr 模式下使用 nuxt 并通过 重定向布局/默认中的用户window.location.replace(),因此您会看到“主站点”一秒钟。
当我想使用 CustomSerilogRequestLogging作为中间件时,出现以下异常:
System.InvalidOperationException:尝试激活“Serilog.AspNetCore.RequestLoggingMiddleware”时无法解析类型“Serilog.Extensions.Hosting.DiagnosticContext”的服务。
我在外部库中的自定义 SerilogRequestLogging:
public static IApplicationBuilder UseCustomSerilogRequestLogging(this IApplicationBuilder app)
{
return app.UseSerilogRequestLogging(options =>
{
options.EnrichDiagnosticContext = (diagnosticContext, httpContext) =>
{
diagnosticContext.Set("RequestHost", httpContext.Request.Host.Value);
diagnosticContext.Set("RequestScheme", httpContext.Request.Scheme);
diagnosticContext.Set("RequestMethod", httpContext.Request.Method);
diagnosticContext.Set("RequestProtocol", httpContext.Request.Protocol);
diagnosticContext.Set("RequestPath", httpContext.Request.Path);
diagnosticContext.Set("RequestRemoteAddress", httpContext.Connection.RemoteIpAddress);
};
});
}
Run Code Online (Sandbox Code Playgroud)
然后我将它作为中间件添加到配置方法中,如下所示:
app.UseCustomSerilogRequestLogging();
Run Code Online (Sandbox Code Playgroud)
在程序.cs中:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseSerilog((provider, context, loggerConfig) =>
{
loggerConfig.Configure(provider, Configuration);
});
webBuilder.UseStartup<Startup>();
});
Run Code Online (Sandbox Code Playgroud)
外部库的扩展方法:
public static void Configure(this LoggerConfiguration loggerConfig,
IServiceProvider provider, IConfiguration config)
{
var sqlserverConnectionString = config["ConnectionStrings:S1"];
var sqlserverLogTable …Run Code Online (Sandbox Code Playgroud) 在 Strapi v4 中,我尝试按照latest-docs设置不和谐的誓言提供程序。我已经设置了按键和所有内容,但是当我尝试点击时/api/connect/discord出现此错误
Grant: mount session middleware first
Run Code Online (Sandbox Code Playgroud)
我仔细观察了一下,发现 Strapi 需要先使用 grant 作为中间件才能使用它。所以我检查了/config/middleware.js
module.exports = [
'strapi::errors',
'strapi::security',
'strapi::cors',
'strapi::poweredBy',
'strapi::logger',
'strapi::query',
'strapi::body',
'strapi::favicon',
'strapi::public',
];
Run Code Online (Sandbox Code Playgroud)
它缺少授权,因此我尝试创建自定义全局授权中间件,但我需要获取应用程序实例并执行以下操作
app.use(session({secret:'grant'));
app.use(grant);
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?或者如果有人有任何想法来解决上述问题?
我试图创建一个没有任何包或库的自定义记录器中间件,它就像保存端点、方法和状态代码响应一样简单。
当我尝试保存状态代码时遇到问题,因为我的响应尚未到达控制器。我试图了解摩根是如何做到这一点的,因为它是我使用的第一个中间件,当我的后端响应时,它会记录状态代码。
有没有一种简单的方法,而无需我修改所有后端控制器?
或者更确切地说,我如何从这个中间件访问控制器的res.status ?
const createLog = (req, res, next) => {
const { method, url } = req;
const { statusCode, statusMessage } = res;
console.log(statusCode, statusMessage); // Both null when reach the middleware
next();
};
Run Code Online (Sandbox Code Playgroud) 中间件是否可以检查URL中是否有值,例如图像ID("/ image/152 /"),如果是,则进行一些检查以确保当前用户有权查看该图像和如果没有重定向到另一个网址?
我不得不为我正在处理的这个网站滚动自己的权限,我不想几乎用我用相同的代码编写整个网站的每个视图,所以我认为一个中间件对于这个来说是个好主意,但我不知道该如何去做.
我有一个django应用程序handler500集.我想为它添加自定义异常处理程序.我创建了一个处理进程异常的中间件:
当视图引发异常时,Django调用process_exception().process_exception()应返回None或HttpResponse对象.如果它返回一个HttpResponse对象,则响应将返回给浏览器.否则,默认异常处理开始.
https://docs.djangoproject.com/en/dev/topics/http/middleware/?from=olddocs#process-exception
我ErrorMiddleware看起来像:
class ErrorMiddleware(object):
def process_exception(self, request, exception):
try:
#logic goes here
except Exception:
pass
return None
Run Code Online (Sandbox Code Playgroud)
我settings看起来像:
MIDDLEWARE_CLASSES = (
'my.error.ErrorMiddleware',
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
)
DEBUG = False
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我的浏览器永远不会从页面获得异常响应.虽然列表中没有我的中间件,但我handler500工作正常.
我想要执行默认的异常处理机制,而不是handler500在我的中间件中显式调用view.
UPD:
handler500模块看起来像这样:
#imports ....
def custom_500(request):
""" Return an error ID (hash) that can be provided to support """
return render(request, '500.html', {
'timestamp': datetime.datetime.now().isoformat(),
'diagcode': "hello",
}
)
Run Code Online (Sandbox Code Playgroud) 我的Flask应用程序中有一个中间件,该中间件用于验证请求标头中的JSON Web令牌,并正在检查以对其进行验证,以下是我的中间件类:
class AuthMiddleware(object):
def __init__(self, app):
self.app = app
def __call__(self, environ, start_response):
path = environ.get('PATH_INFO')
if path != '/authenticate' or path != '/token':
token = environ.get('HTTP_X_ACCESS_TOKEN')
verfied_token = verify_token(token)
if verfied_token is False:
abort(401)
elif verfied_token is True:
# payload = get_token_payload(token)
# check_permissions(payload)
pass
return self.app(environ, start_response)
Run Code Online (Sandbox Code Playgroud)
verify_token() 是一个将返回True或False的函数,并且如果返回False,我希望它以错误401终止。但是,它以错误500终止:
class AuthMiddleware(object):
def __init__(self, app):
self.app = app
def __call__(self, environ, start_response):
path = environ.get('PATH_INFO')
if path != '/authenticate' or path != '/token':
token = environ.get('HTTP_X_ACCESS_TOKEN')
verfied_token = …Run Code Online (Sandbox Code Playgroud) 使用julienschmidt/httprouter时连接中间件的最佳方法是什么?
就我用Google搜索而言,http.HandlerFunc只接受表单中的func (w ResponseWriter, r *Request)函数,而httprouter.Handle函数则是这种形式func (w http.ResponseWriter, r *http.Request, ps httprouter.Params).
如何在不将httprouter.Handle函数转换为http.HandlerFunc的情况下链接中间件?
例如:
我的routes.go是形式,
router := httprouter.New()
router.POST("/api/user/create", middlewares.EscapeStringsMiddleware(User.CreateUser))
log.Fatal(http.ListenAndServe(":8000", router))
Run Code Online (Sandbox Code Playgroud)
如何为上述路由编写中间件函数?
已经尝试过的方法:
1.
func EscapeStringsMiddleware(next http.Handler) httprouter.Handle {
return func (response http.ResponseWriter, request *http.Request, ps httprouter.Params) {
err := request.ParseForm()
if err != nil {
panic(err)
}
for key, values := range request.Form {
for i, value := range values {
value = template.HTMLEscapeString(value)
value = template.JSEscapeString(value)
request.Form[key][i] = value
}
}
next.ServeHTTP(response, request) …Run Code Online (Sandbox Code Playgroud) middleware ×10
asp.net-core ×2
c# ×2
django ×2
node.js ×2
python ×2
.net-5 ×1
abort ×1
backend ×1
django-views ×1
express ×1
flask ×1
go ×1
javascript ×1
morgan ×1
multer ×1
next-connect ×1
next.js ×1
nuxt.js ×1
plugins ×1
redirect ×1
serilog ×1
strapi ×1
vue.js ×1