2015-06-24 1 views
1

Я недавно перевел сайт V2.20 nopCommerce, который работал на IIS6 на сервере Windows 2003, на IIS8, работающий на сервере Windows 2012, и теперь, когда удаленная почта выполняется для модуля WorldPay, все, что я вижу, это пустой белый экран?Переход на IIS8 на Windows 2012 Server - удаленная почта теперь показывает пустую страницу

У меня такое чувство, что это не ограничивается модулем WorldPay или действительно nopCommerce и является скорее проблемой MVC с кодом, который был разработан в более ранней версии ASP.Net, запущенной на ASP.Net 4.5.

У любого есть идеи или решения относительно того, почему удаленная почта не будет работать, см. Пример кода ниже удаленной почты, форма, когда она написана в контексте HTTP, просто не срабатывает onload.

using System.Collections.Specialized; 
using System.Web; 
using Nop.Core; 
using Nop.Core.Infrastructure; 

namespace Nop.Web.Framework 
{ 
/// <summary> 
/// Represents a RemotePost helper class 
/// </summary> 
public partial class RemotePost 
{ 
    private readonly HttpContextBase _httpContext; 
    private readonly IWebHelper _webHelper; 
    private readonly NameValueCollection _inputValues; 

    /// <summary> 
    /// Gets or sets a remote URL 
    /// </summary> 
    public string Url { get; set; } 

    /// <summary> 
    /// Gets or sets a method 
    /// </summary> 
    public string Method { get; set; } 

    /// <summary> 
    /// Gets or sets a form name 
    /// </summary> 
    public string FormName { get; set; } 

    /// <summary> 
    /// Gets or sets a form character-sets the server can handle for form-data. 
    /// </summary> 
    public string AcceptCharset { get; set; } 

    /// <summary> 
    /// A value indicating whether we should create a new "input" HTML element for each value (in case if there are more than one) for the same "name" attributes. 
    /// </summary> 
    public bool NewInputForEachValue { get; set; } 

    public NameValueCollection Params 
    { 
     get 
     { 
      return _inputValues; 
     } 
    } 

    /// <summary> 
    /// Creates a new instance of the RemotePost class 
    /// </summary> 
    public RemotePost() 
     : this(EngineContext.Current.Resolve<HttpContextBase>(), EngineContext.Current.Resolve<IWebHelper>()) 
    { 
    } 

    /// <summary> 
    /// Creates a new instance of the RemotePost class 
    /// </summary> 
    /// <param name="httpContext">HTTP Context</param> 
    /// <param name="webHelper">Web helper</param> 
    public RemotePost(HttpContextBase httpContext, IWebHelper webHelper) 
    { 
     this._inputValues = new NameValueCollection(); 
     this.Url = "http://www.someurl.com"; 
     this.Method = "post"; 
     this.FormName = "formName"; 

     this._httpContext = httpContext; 
     this._webHelper = webHelper; 
    } 

    /// <summary> 
    /// Adds the specified key and value to the dictionary (to be posted). 
    /// </summary> 
    /// <param name="name">The key of the element to add</param> 
    /// <param name="value">The value of the element to add.</param> 
    public void Add(string name, string value) 
    { 
     _inputValues.Add(name, value); 
    } 

    /// <summary> 
    /// Post 
    /// </summary> 
    public void Post() 
    { 
     _httpContext.Response.Clear(); 
     _httpContext.Response.Write("<html><head>"); 
     _httpContext.Response.Write(string.Format("</head><body onload=\"document.{0}.submit()\">", FormName)); 
     if (!string.IsNullOrEmpty(AcceptCharset)) 
     { 
      //AcceptCharset specified 
      _httpContext.Response.Write(string.Format("<form name=\"{0}\" method=\"{1}\" action=\"{2}\" accept-charset=\"{3}\">", FormName, Method, Url, AcceptCharset)); 
     } 
     else 
     { 
      //no AcceptCharset specified 
      _httpContext.Response.Write(string.Format("<form name=\"{0}\" method=\"{1}\" action=\"{2}\" >", FormName, Method, Url)); 
     } 
     if (NewInputForEachValue) 
     { 
      foreach (string key in _inputValues.Keys) 
      { 
       string[] values = _inputValues.GetValues(key); 
       if (values != null) 
       { 
        foreach (string value in values) 
        { 
         _httpContext.Response.Write(string.Format("<input name=\"{0}\" type=\"hidden\" value=\"{1}\">", HttpUtility.HtmlEncode(key), HttpUtility.HtmlEncode(value))); 
        } 
       } 
      } 
     } 
     else 
     { 
      for (int i = 0; i < _inputValues.Keys.Count; i++) 
       _httpContext.Response.Write(string.Format("<input name=\"{0}\" type=\"hidden\" value=\"{1}\">", HttpUtility.HtmlEncode(_inputValues.Keys[i]), HttpUtility.HtmlEncode(_inputValues[_inputValues.Keys[i]]))); 
     } 
     _httpContext.Response.Write("</form>"); 
     _httpContext.Response.Write("</body></html>"); 
     _httpContext.Response.End(); 
     //store a value indicating whether POST has been done 
     _webHelper.IsPostBeingDone = true; 
    } 
} 
} 

ответ

0

После долгих поисков я наткнулся на следующее сообщение:

ASP.NET MVC 3 - Replacing HttpContext Response Not Working

Оказывается Response.Close() не работает так, как ожидалось, и иногда может привести к потере данных, поэтому рекомендация заключается в использовании следующей строки кода:

HttpContext.Current.ApplicationInstance.CompleteRequest();

Я пробовал это, и мгновенно RemotePost снова начал работать. Еще одна полезная статья о том, почему Response.Close() не всегда работает должным образом, ниже.

http://blogs.msdn.com/b/aspnetue/archive/2010/05/25/response-end-response-close-and-how-customer-feedback-helps-us-improve-msdn-documentation.aspx

Смежные вопросы