3

私は支払いプロバイダー (SagePay) をテストしていますが、プロセスの一部として、サーバーが私のサイトに POST し、応答を期待しています。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 属性を削除する必要があります)、両方のページに同じデータが表示されます。

これは、支払いプロバイダーが POST している MVC URL です。

http://myipaddress/CA_UAT/Token/TestCallback

これは正常に動作する従来の asp URL です。

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

テスト目的でURLが一致するように、aspページの「トークン」ディレクトリを作成しました。

私は何を間違っていますか?

アップデート

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

sagepayがファイル拡張子を期待しているのではないかと思います。つまり、相続人側で何らかのURL検証を行っています。アクションが呼び出されているかどうか知っていますか?

また、MVCURLが「TestCallback.asp」のようになるルートを追加してみてください。

于 2012-04-30T15:49:03.010 に答える
0

ビューに応答を記述する代わりに、次のようにアクション メソッドに記述します。

[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

このようにしてみてください:

[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");
}

またはよりMVCっぽい方法で:

モデルを見る:

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 に答える