RainerAtSpirit 和 margabit,你说的都是对的,谢谢。这是我实现服务器端的方式:
首先我应该注意,与服务器的所有交互都是通过WebApi
控制器完成的。
因此,例如,如果 URL 是:(
http://localhost:61285/home/category2/subCategory22
对于 localhost),服务器会尝试查找名为“home”的控制器和其中名为“category2”的操作。由于没有此类操作,我收到 404 错误。
我想要的是服务器将调用“主”控制器,但将 URL 的其余部分作为参数发送给客户端。我的解决方案是在控制器名称后添加一个哈希,这样 URL 将如下所示http://localhost:61285/home/#/category2/subCategory22
:如果发生这种情况,那么客户端将处理散列部分而不会出现 404 错误。
为此:
我在“web.config”中添加了以下内容:
<customErrors mode="On" defaultRedirect="Error">
<error statusCode="404" redirect="Error" />
</customErrors>
然后我创建一个名为“ErrorController”的控制器,其中包含以下类:
public class ErrorController : ApiController
{
[HttpGet, HttpPost, HttpPut, HttpDelete, HttpHead, HttpOptions, AcceptVerbs("PATCH"), AllowAnonymous]
public HttpResponseMessage Handle404()
{
string [] parts = Request.RequestUri.OriginalString.Split(new[] { '?' }, StringSplitOptions.RemoveEmptyEntries);
string parameters = parts[ 1 ].Replace("aspxerrorpath=","");
var response = Request.CreateResponse(HttpStatusCode.Redirect);
response.Headers.Location = new Uri(parts[0].Replace("Error","") + string.Format("#{0}", parameters));
return response;
}
}
发生的情况是,当服务器获得一个没有我上面提到的相关操作的 URL 时,它以以下格式将其重定向到此控制器:http://localhost:61285/Error?aspxerrorpath=home/category2/subCategory22
如您所见,我对其进行操作以添加哈希并删除不必要的信息:http://localhost:61285/home/#/category2/subCategory22
并且将服务器重定向到“家庭”控制器。
您可能想知道我为什么要这样做 - 原因是 Durandal,一个很棒的平台,使我能够使用推送状态,但为了实现这一点,我必须解决服务器获取非散列 URL 并通过尽管没有相关的控制器/动作,但它还是给客户的;Durandal 获取的是一个散列 URL,但会自动删除散列,用户最终会看到一个无散列 URL,而 Durandal 提供所有必要的推送状态功能。
埃利尔