我们的应用程序使用简单的 aspx 语法来显示,例如,服务器的版本:
<h1>Server Engine v<%=System.Reflection.Assembly.GetAssembly(typeof(Server.Engine)).GetName().Version %></h1>
// "Server Engine v3.6.1268.0"
它在 VS 2010 和 2012 中运行良好,但在 VS 2013 中我们得到源代码:
<h1>Server Engine v 3.6.1268.0 </h1>
它在浏览器中看起来是一样的,但在另一个地方,我们用 aspx 语法形成 Url,结果 Url 在路径中有那些奇怪的符号。这是代码:
var folderUrl = window.location.protocol + '//' + window.location.hostname + ':' + port + '<%=Request.ApplicationPath.TrimEnd('/')%>/';
结果源:
var folderUrl = window.location.protocol + '//' + window.location.hostname + ':' + port + ' /';
同一个项目在 VS2012 中运行良好。为什么会发生这种情况以及如何避免这个问题?
更新1:
这里是十六进制视图中的这些奇怪符号:
00000002E0: 3A 27 20 2B 20 70 6F 72 │ 74 20 2B 20 27 EF BB BF :' + port + 'п»ї
00000002F0: EF BB BF EF BB BF EF BB │ BF EF BB BF 2F 27 3B 0A п»їп»їп»їп»ї/';◙
更新2:
我补充说:
<%=System.Diagnostics.Process.GetCurrentProcess().MainModule.FileVersionInfo %>
检测当前的 IIS 版本。VS2012 和 VS2013 的结果是相同的:
File: C:\Program Files (x86)\IIS Express\iisexpress.exe InternalName: iisexpress.exe OriginalFilename: iisexpress.exe.mui FileVersion: 8.0.8418.0 (winmain(eokim).120521-1311) FileDescription: IIS Express Worker Process Product: Internet Information Services ProductVersion: 8.0.8418.0 Debug: False Patched: False PreRelease: False PrivateBuild: True SpecialBuild: False Language: Language Neutral
只有当我选择“修改”时才能重现问题
更新5:
这是简单的复制示例:
using System.Web;
using System.Web.UI;
namespace WebApplication2
{
public class DavHandler : IHttpHandler
{
public bool IsReusable
{
get { return true; }
}
public void ProcessRequest(HttpContext context)
{
context.Response.BufferOutput = false;
Page page = (Page)System.Web.Compilation.BuildManager.CreateInstanceFromVirtualPath(
"~/MyCustomHandlerPage.aspx", typeof(Page));
page.ProcessRequest(HttpContext.Current);
}
}
}
MyCustomHandlerPage.aspx:
<%@ Page Title="WebDAV" Language="C#" AutoEventWireup="true"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>IT Hit WebDAV Server Engine</title><meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css">
body { font-family: Verdana; font-size:smaller; }
li { padding-bottom: 7px; }
input {width: 250px}
</style>
</head>
<body>
<p>"<%="TEST" %>"</p>
</body>
</html>
网络配置:
<?xml version="1.0"?>
<configuration>
<appSettings>
<add key="RepositoryPath" value="~/App_Data/WebDAV/Storage"/>
</appSettings>
<system.web>
<customErrors mode="Off"/>
<authentication mode="None"/>
<authorization>
<allow users="*"/>
</authorization>
<globalization requestEncoding="utf-8" responseEncoding="utf-8"/>
<compilation targetFramework="4.0" debug="true"/>
</system.web>
<system.webServer>
<handlers>
<clear />
<add name="My WebDAV Handler" path="*" verb="*" type="WebApplication2.DavHandler, WebApplication2" preCondition="integratedMode" />
</handlers>
</system.webServer>
</configuration>
如果您在 Internet Explorer 中从 Visual Studio 2013 运行此示例并查看结果页面的源代码,您将看到:
<p>" TEST "</p>
然后您可以将页面保存为文件并使用 HEX 查看器查看。您将看到插入的那些字节顺序标记“EF BB BF”。但不适用于任何其他 Visual Studio 版本。
更新6:
在 VS 2013 中以 debug="true" 模式创建项目时会出现此问题。当我从 VS2010/2012 打开这个项目时,会出现同样的问题。但是当在 VS2010/2012 中创建项目时,问题就不存在了。