3

我正在测试支付提供商 (SagePay),作为流程的一部分,他们的服务器会发布到我的站点并期望得到响应。我无法使用 MVC 让它工作。

我设置了一个经典的 asp 测试响应页面并将其添加到我的 MVC 应用程序中:

<%
Response.Buffer = True 
response.Clear()
response.contenttype="text/plain"
response.write "Status=OK" & vbCRLF
response.write "RedirectURL=http://www.redirectsomewhere.co.uk" & vbCRLF
response.End()
%>

这工作很好。

但是,当我尝试对 MVC 执行相同操作时,它不起作用:

控制器:

[HttpPost]
public ActionResult TestCallback()
{
     return View();
}

看法:

@{
    Response.Buffer = true;
    Response.Clear();
    Response.ContentType = "text/plain";
    Response.Write("Status=OK" + System.Environment.NewLine);
    Response.Write("RedirectURL=http://www.redirectsomewhere.co.uk" + System.Environment.NewLine);
    Response.End();
}

该错误消息是来自支付提供商的一般错误,因此没有真正的帮助,但我已将错误范围缩小到页面呈现的点。

我可以很好地浏览两个页面(为此我需要从 MVC 控制器方法中删除 HttpPost 属性),并且两个页面都显示相同的数据。

这是支付提供商发布到的 MVC url:

http://myipaddress/CA_UAT/Token/TestCallback

这是可以正常工作的经典 asp URL:

http://myipaddress/CA_UAT/Token/TestCallback.asp

我为 asp 页面创建了一个“令牌”目录,以便 url 匹配以用于测试目的。

我究竟做错了什么?

更新

为了回应 Hari 的评论,我安装了一个名为“Header Spy”的 Firefox 插件,它为我提供了以下信息:

Response HTTP/1.1 200 OK
Source: Response
HttpHeader:Server
Request:User-Agent Cookie
Response:Response Date Set-Cookie

两个页面显示相同的信息。

4

4 回答 4

1

您无需返回操作结果即可将纯文本发送回屏幕。完成此操作的最简单方法是返回一个字符串值。将控制器中的代码替换为以下代码。

[HttpPost]
public string TestCallback()
{
  string result = "Status=OK";
  result += System.Environment.NewLine;
  result += "RedirectURL=http://www.redirectsomewhere.co.uk";
  result += System.Environment.NewLine;
  return result;
}

这将不会返回您在字符串中的其他响应。通过使用 ActionResult 和 View,您可能会从主视图返回标记。

于 2012-04-26T07:33:59.427 回答
0

我不会在视图中编写响应,而是将其写在 action 方法中,如下所示:

[HttpPost]
public ActionResult TestCallback()
{
  Response.Buffer = true;
  Response.Clear();
  Response.ContentType = "text/plain";
  Response.Write("Status=OK" + System.Environment.NewLine);
  Response.Write("RedirectURL=http://www.redirectsomewhere.co.uk" + System.Environment.NewLine);
  Response.Flush();
  return new EmptyResult();
}

返回 EmptyResult 时,您将确保 MVC 不会在响应中附加任何内容。

于 2012-04-20T18:45:30.603 回答
0

我想知道 sagepay 是否期望文件扩展名..即在继承人方面进行某种 URL 验证。你知道你的 Action 是否被调用了吗?

还可以尝试添加一个路由,使您的 mvc URL 看起来像“TestCallback.asp”。

于 2012-04-30T15:49:03.010 回答
0

试试这样:

[HttpPost]
public ActionResult TestCallback()
{
    var sb = new StringBuilder();
    sb.AppendLine("Status=OK");
    sb.AppendLine("RedirectURL=http://www.redirectsomewhere.co.uk");
    return Content(sb.ToString(), "text/plain");
}

或者以更 MVCish 的方式:

查看型号:

public class ResponseViewModel
{
    public string Status { get; set; }
    public string RedirectUrl { get; set; }
}

然后是自定义操作结果:

public class StatusActionResult : ContentResult
{
    private readonly ResponseModel _model;
    public StatusActionResult(ResponseModel model)
    {
        _model = model;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        var response = context.HttpContext.Response;
        response.ContentType = "text/plain";
        response.Write(string.Format("Status={0}{1}", _model.Status, Environment.NewLine));
        response.Write(string.Format("RedirectURL={0}", _model.RedirectUrl));
    }
}

最后是您的控制器操作:

[HttpPost]
public ActionResult TestCallback()
{
    var model = new ResponseModel
    {
        Status = "OK",
        RedirectUrl = "http://www.redirectsomewhere.co.uk"
    };
    return new StatusActionResult(model);
}
于 2012-04-26T07:40:44.797 回答