【问题标题】:ActionResult redirect renders using ToString()ActionResult 使用 ToString() 重定向呈现
【发布时间】:2009-12-21 22:48:45
【问题描述】:

使用以下示例:http://www.west-wind.com/Weblog/posts/899303.aspx

下面一行……

return req.RedirectingResponse.AsActionResult();

呈现字符串“DotNetOpenAuth.Messaging.OutgoingWebResponseActionResult”。 这是在发布的行中作为 ActionResult 返回的类。有谁知道为什么我将类名作为字符串而不是实际重定向?

提前谢谢!

【问题讨论】:

  • 你的函数的返回类型是什么?
  • ActionResult... 请看 url 中的示例... 函数是 [AcceptVerbs(HttpVerbs.Post | HttpVerbs.Get), ValidateInput(false)] public ActionResult OpenIdLogOn(string returnUrl) { ...}
  • IMO 链接中提供的代码示例没有任何问题,DotNetOpenAuth 库也没有。我已经检查了几次代码,并且没有很多代码可能是错误的。我认为 error 在路由或 web.config 中的某个地方...问题是在哪里。

标签: asp.net-mvc dotnetopenauth actionresult


【解决方案1】:

可能是您的 Bin 目录和 Web 服务器中有多个版本的 MVC?令我震惊的是,如果您将多个 MVC 类型的程序集(不同版本)(例如 ActionResult 加载到您的 AppDomain 中,并且 AsActionResult 方法返回一个版本而您的 MVC Web 应用程序使用了不同的版本,那么它可能只是保释使用ToString。您正在运行哪个版本的 ASP.NET MVC? DotNetOpenAuth 的AsActionResult 方法是针对1.0 RTM 版本的MVC 框架编译的。如果您使用的是 ASP.NET MVC 2(包含在 .NET 4.0 中),我可以看出这可能是个问题。

我相信,如果您将此 sn-p 添加到 MVC 2 的 web.config 文件中,它将允许您使用 DotNetOpenAuth 的官方构建,因此您不必构建自己的:

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" />
        </dependentAssembly>
    </assemblyBinding>
</runtime>

【讨论】:

  • 确实可能是这样!会尽快尝试的!
  • 我已经更改了对 MVC 2 的引用。最初,我收到一个异常,说签名无效,所以我删除了它。我现在收到以下错误(这似乎比之前的结果好很多):在 ContractHelper.TriggerFailureImplementation(ContractFailureKind kind, String displayMessage, String userMessage, String conditionText, Exception innerException) 使用 Contract.Requires 时必须使用重写器在 ContractHelper.TriggerFailure(ContractFailureKind kind, String displayMessage, String userMessage, String conditionText, Exception innerException) ...
  • 这个错误是因为以下原因:social.msdn.microsoft.com/Forums/en/codecontracts/thread/… 所以,基本上,DotNetOpenAuth 不能针对 MVC 2?
  • 所以您的目标是 MVC 2。MVC 1 应该自动重定向到 MVC 2。但是任何 MVC 1 程序集的存在都可能会破坏这一点。你能确定你网站的 Bin 文件夹中没有任何 MVC 1 程序集吗?
  • DNOA 可以针对 MVC 2 没问题。但是您必须在构建 DNOA 时安装代码契约——否则您将不会遇到构建中断,但运行时将无法正常工作,因为您给出的原因。这不是 MVC2,而是代码契约必须在生成的程序集上运行 ccrewrite。
【解决方案2】:

另一种解决方案,适用于 .Net 3.5 和 MVC 2。

代替

var authRequest = relyingParty.CreateRequest(....);
....
return authRequest.RedirectingResponse.AsActionResult();

使用

var authRequest = relyingParty.CreateRequest(....);
....
authRequest.RedirectToProvider();
Response.End();
return new EmptyResult();

【讨论】:

    猜你喜欢
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多