2012-04-20 10 views
3

私は支払いプロバイダ(SagePay)をテストしています。プロセスの一部として、自分のサイトに自分のサーバーのPOSTが送信され、応答が必要です。私はこれをMVCを使用して動作させることはできません。サードパーティのサイトからASP.NET MVCアプリケーションにポストする

私は従来のASPテストREPONSEページを設定し、私の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が一致するようにします。

私は間違っていますか?

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

どちらのページが同じ情報を表示:

UPDATE

ハリさんのコメントへの応答では、私は私にこの情報を提供する「ヘッダースパイ」と呼ばれるFirefoxのプラグインをインストールしました。

+0

コントローラー名とは何ですか? – Dante

+0

@Dante - コントローラ名はトークンです。 – markpsmith

+0

文字通り、トークン、つまりTokenControllerを意味しますか? – Dante

答えて

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(); 
} 

あなたはMVCは、応答には何も追加しないことを保証しますEmptyResult返します。

+0

残念ながら、これは何の違いもありませんが、応答のエラーは除外されます。 – markpsmith

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を使用すると、マスタービューからマークアップが返される可能性があります。

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

そして最後にあなたのコントロールLERアクション:

[HttpPost] 
public ActionResult TestCallback() 
{ 
    var model = new ResponseModel 
    { 
     Status = "OK", 
     RedirectUrl = "http://www.redirectsomewhere.co.uk" 
    }; 
    return new StatusActionResult(model); 
} 
0

sagepayは、相続人側のURLの検証のいくつかの種類をやってファイルextension..ieを期待しているのだろうか。あなたの行動が呼び出されているかどうか知っていますか?

また、mvc URLを "TestCallback.asp"のように見せるルートを追加してみてください。

関連する問題