视图序列化时链接中断
本文关键字:中断 链接 序列化 视图 | 更新日期: 2023-09-27 18:08:01
我将以下内容作为填充部分视图的视图模型的一部分:
public string DownloadLink
{
get
{
UrlHelper url = new UrlHelper(HttpContext.Current.Request.RequestContext);
switch (this.Type)
{
case (int)DocumentTypes.WasteNote: {
return url.Action("PaperWork", "Jobs", new { JobId = this.DOCJobId }, HttpContext.Current.Request.IsSecureConnection ? "https" : "http" );
}
case (int)DocumentTypes.Contract:
case (int)DocumentTypes.DestructionCert:
case (int)DocumentTypes.Quote:
default: { return url.Action("Download", "Documents", new { DocId = this.DocumentLinkId }, HttpContext.Current.Request.IsSecureConnection ? "https" : "http"); }
}
}
}
在视图中调用:
@model IEnumerable<Document>
@using CustomerDashboard.ViewModels;
@using CustomerDashboard.Utilities;
@{ Layout = null; }
@foreach (Document doc in Model)
{
<li>
<a href="@doc.DownloadLink" class="documentDownload">
<div class="col-sm-12 col-md-5 li-row li-row-icon">
<div class="pull-left">
<img height="40" src="/Content/img/file-icons/@doc.Icon" />
</div>
...
</a>
</li>
}
虽然这是直接呈现在另一个视图中生成的链接是好的,但是,我序列化部分并返回JSON:
public string RenderRazorViewToString(string viewName, object model)
{
//https://gist.github.com/timiles/2828976
ViewData.Model = model;
using (var sw = new StringWriter())
{
var viewResult = ViewEngines.Engines.FindPartialView(ControllerContext,
viewName);
var viewContext = new ViewContext(ControllerContext, viewResult.View,
ViewData, TempData, sw);
viewResult.View.Render(viewContext, sw);
viewResult.ViewEngine.ReleaseView(ControllerContext, viewResult.View);
return sw.GetStringBuilder().ToString();
}
}
然后作为Json从控制器返回:
return Json(new {
totalCount = (int)Session["DocumentTotalCount"],
markup = RenderRazorViewToString("_DocumentListAjax", docs)
},JsonRequestBehavior.AllowGet);
要明确的是,问题发生在JSON序列化之前-这是讨厌的,但删除了www前缀:
return Json(new {
totalCount = (int)Session["DocumentTotalCount"],
markup = RenderRazorViewToString("_DocumentListAjax", docs).Replace("www.","")
},JsonRequestBehavior.AllowGet);
当这样做时,从似乎来自LAN外部(这听起来很奇怪),所有的url都有www前缀-即https://example.com变成https://www.example.com。我正在努力追踪为什么会发生这种情况以及如何修复它。
对于您的代码,所描述的行为只能在服务不同的请求时发生。在另一个视图中呈现部分视图必须作为处理上下文主机设置为example.com
的http请求的结果发生(例如请求https://example.com/viewWithAPartialView)。
另一方面,服务包含部分视图的JSON是处理对www.example.com
的请求(例如对https://www.example.com/getPartialViewJson/partialViewName的请求)的结果。
因为在它的主视图中呈现部分视图可能已经完成了当通过"正常"url浏览网站时,一切都按计划进行。
JSON端点可以通过AJAX查询,检查形成请求的代码-这是罪魁祸首。另一种可能性是,您设置了URL重写以剥离www
前缀,并且由于某种原因重写规则与JSON服务端点不匹配。
更新:
考虑到额外的信息,看起来问题可能与主机配置(IIS和负载平衡器设置)有关。我的建议是试着在你的网页上添加下面这一行。配置文件:
<appSettings>
...
<add key="aspnet:UseHostHeaderForRequestUrl" value="true" />
...
</appSettings>
这将迫使ASP使用来自传入请求的主机头而不是请求服务器名称变量。如果问题的原因确实是配置问题,这应该会有所帮助。