我正在使用MVC4 Web Api控制器,我的部分网址包含%23("#")。客户端代码使用UrlEncode发出请求。服务代码调用HttpUtility.UrlDecode(HttpActionContext.Request.RequestUri.Query)来获取查询字符串。我可以在我的本地环境中正确运行它;但是,部署在服务器上的版本在HttpUtility.UrlDecode(HttpActionContext.Request.RequestUri.Query)调用上返回空字符串。我需要做些什么才能使它在服务器上运行?
编辑:更多信息。相同的服务器代码,相同的URL路径但可在本地计算机上运行但不在服务器计算机上运行为简单起见,我使用chrome浏览器进行api调用。该网址已编码为http://example.com/api/order/1059%23111?name=xyz%fid=61 这是为了获得订单1059#111。
当我调用localhost:64986 / api / order / 1059%23111?name = xyz%fid = 61时,它可以工作,但是当我从浏览器调用http://example.com/api/order/1059%23111?name=xyz%fid=61时,由于查询而出现错误字符串是空的。在类的OnAuthorization调用中的服务器上,我从AuthroizationFilter扩展,我需要解析查询字符串,并使用HttpUtility.ParseQueryString(actionContext.Request.RequestUri.Query)来获取查询名称 - 值对。当命中服务器时,actionContext.Request.RequestUri.Query返回""但是在我的本地服务器上,它返回"?name = xyz%fid = 61"。
以下是api
中的代码片段 public class MyAuthorizeAttribute : AuthorizationFilterAttribute, IExceptionFilter
{
public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
{
if (Thread.CurrentPrincipal.Identity.IsAuthenticated)
return;
var authHeader = actionContext.Request.Headers.Authorization;
string qstr = HttpUtility.UrlDecode(actionContext.Request.RequestUri.Query);
NameValueCollection query = HttpUtility.ParseQueryString(qstr);
if (query.Count > 0)
{
...process validation
}
else
actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "Unauthorized user.");
}
}
如果API调用是我的本地web api(localhost:64986 / api / order / 1059%23111?name = xyz%fid = 61),那么如果调用是关于web api的话,它会进入验证服务器(http://example.com/api/order/1059%23111?name=xyz%fid=61),它进入了else并返回未经授权的用户。什么会导致本地与生产服务器的不同?是否需要将IIS或任何内容添加到web.config?