HttpContext.Current WebContentTypeMapper / GetMessageFormatForContentType 中为空
HttpContext.Current null in WebContentTypeMapper / GetMessageFormatForContentType
我想写一个 WebContentTypeMapper
returns WebContentFormat
依赖于 uri 路径。
到现在为止我用的是HttpContext.Current.Request.PathInfo
。
但是如果有大量的 POST-请求正文超过 64k 那么 HttpContext.Current
是空的。
我发现 HttpContext.Current 不打算在那里使用。但它适用于所有其他情况,当请求只有几 kb 小的时候。
有没有其他方法可以在GetMessageFormatForContentType()
中找到当前请求的路径?
public class RawContentTypeMapper : WebContentTypeMapper
{
public override WebContentFormat GetMessageFormatForContentType(string contentType)
{
string pathInfo;
try
{
pathInfo = HttpContext.Current.Request.PathInfo;
}
catch (NullReferenceException e)
{
// This happens for large POST requests
pathInfo = ...please help!
}
switch (pathInfo)
{
case "/abc/path1":
case "/abc/path2":
return WebContentFormat.Raw;
default:
return WebContentFormat.Default; // No change to default behavior
}
}
}
我现在有办法了。由几个变化组成:
我将 RawContentTypeMapper
更改为始终 return WebContentFormat.Raw
Web.config:
添加了使用 RawContentTypeMapper
的绑定副本并删除了 contentTypeMapper
属性。所以它使用默认映射器。
通过使用 RawContentTypeMapper 的绑定向每个地址 ("abc/path1"...) 添加了一个端点。
使用默认绑定向基地址 "abc" 添加了一个端点。
IMySourceCode.cs: 和 MySourceCode.cs:
用 UriTemplate = ""
创建了一个新的 OperationContract
。在那里,我检查 HttpContext.Current.Request.PathInfo
是否有 "abc/path1/"、"abc/path2/"... 并调用原始的 OperationContract 方法。
为此,所有 OperationContracts 必须具有相同的签名(此处为 void MyMethod(Stream data))。
添加了 Global.asax 以将路径 "abc/path1" 重写为 "abc/path1/"...:[=18=]
protected void Application_BeginRequest(object sender, EventArgs e)
{
var pathInfo = HttpContext.Current.Request.PathInfo.ToLowerInvariant();
if (pathInfo.StartsWith("/abc/"))
{
foreach (var s in new[] { "/abc/path1", "/abc/path2" })
{
if (pathInfo == s)
{
var rawUrl = HttpContext.Current.Request.RawUrl.ToLower(CultureInfo.InvariantCulture);
HttpContext.Current.RewritePath($"{rawUrl}/");
break;
}
}
}
}
我想写一个 WebContentTypeMapper
returns WebContentFormat
依赖于 uri 路径。
到现在为止我用的是HttpContext.Current.Request.PathInfo
。
但是如果有大量的 POST-请求正文超过 64k 那么 HttpContext.Current
是空的。
我发现 HttpContext.Current 不打算在那里使用。但它适用于所有其他情况,当请求只有几 kb 小的时候。
有没有其他方法可以在GetMessageFormatForContentType()
中找到当前请求的路径?
public class RawContentTypeMapper : WebContentTypeMapper
{
public override WebContentFormat GetMessageFormatForContentType(string contentType)
{
string pathInfo;
try
{
pathInfo = HttpContext.Current.Request.PathInfo;
}
catch (NullReferenceException e)
{
// This happens for large POST requests
pathInfo = ...please help!
}
switch (pathInfo)
{
case "/abc/path1":
case "/abc/path2":
return WebContentFormat.Raw;
default:
return WebContentFormat.Default; // No change to default behavior
}
}
}
我现在有办法了。由几个变化组成:
我将 RawContentTypeMapper
更改为始终 return WebContentFormat.Raw
Web.config:
添加了使用
RawContentTypeMapper
的绑定副本并删除了contentTypeMapper
属性。所以它使用默认映射器。通过使用 RawContentTypeMapper 的绑定向每个地址 ("abc/path1"...) 添加了一个端点。
使用默认绑定向基地址 "abc" 添加了一个端点。
IMySourceCode.cs: 和 MySourceCode.cs:
用 UriTemplate = ""
创建了一个新的 OperationContract
。在那里,我检查 HttpContext.Current.Request.PathInfo
是否有 "abc/path1/"、"abc/path2/"... 并调用原始的 OperationContract 方法。
为此,所有 OperationContracts 必须具有相同的签名(此处为 void MyMethod(Stream data))。
添加了 Global.asax 以将路径 "abc/path1" 重写为 "abc/path1/"...:[=18=]
protected void Application_BeginRequest(object sender, EventArgs e)
{
var pathInfo = HttpContext.Current.Request.PathInfo.ToLowerInvariant();
if (pathInfo.StartsWith("/abc/"))
{
foreach (var s in new[] { "/abc/path1", "/abc/path2" })
{
if (pathInfo == s)
{
var rawUrl = HttpContext.Current.Request.RawUrl.ToLower(CultureInfo.InvariantCulture);
HttpContext.Current.RewritePath($"{rawUrl}/");
break;
}
}
}
}