2014-01-14 62 views
0

我正在使用Asp.net MVC,並試圖通過將發佈數據寫入日誌文件來調試我的方法。從請求中獲取發佈數據將返回null

我把這個帖子C# .net equivilent of HTTP_RAW_POST_DATA?並試圖運行它。

這裏是我的ActionResult

public ActionResult Receipt(string id) 
    { 
     try 
     { 
     using (var sw = new StreamWriter(@"C:\LOGS\RECEIPTLOG.TXT", true)) 
     { 
      sw.WriteLine("-------------------------------------------"); 
      sw.WriteLine("Start Receipt: " + DateTime.Now); 
      sw.WriteLine("Browser: " + Request.Browser.Id); 
      sw.WriteLine("Browser Version: {0}.{1}", Request.Browser.MajorVersion, Request.Browser.MinorVersion); 
      sw.WriteLine("Request.UserHostAddress: " + Request.UserHostAddress); 
      if (Request.UrlReferrer != null) 
      { 
      sw.WriteLine("Request.UrlReferrer: " + Request.UrlReferrer); 
      } 

      foreach (var headerKey in Request.Headers.Keys) 
      { 
      var headerValues = Response.Headers.GetValues(headerKey.ToString()); 
      if (headerValues != null) 
      { 
       sw.WriteLine("Response Header: {0}, Value: {1}", headerKey, String.Join(";", headerValues)); 
      } 
      } 
     } 
     } 
     catch (Exception ex) 
     { 
     Console.WriteLine("error:" + ex.Message); 
     } 

     var control = Logging.StartLog(); 
     control.Source = SourceEnum.WebPortal; 

     try 
     { 
     Logging.WriteLog("Start Receipt"); 

     var count = 0; 
     var postVals = new Dictionary<string, string>(); 
     foreach (var key in Request.Form.AllKeys) 
     { 
      Logging.WriteLog("count: " + count); 
      Logging.WriteLog(string.Format("key: {0} Value: {1}", key, Request.Form[key])); 
      postVals.Add(key, Request.Form[key]); 
      Logging.WriteLog("finished count: " + count); 
      count++; 
     } 
     Logging.WriteLog("finished processing ALLKeys"); 
     var paymentReq = createPaymentRequest(postVals); 
     Logging.WriteLog("finished processing 'var paymentReq = createPaymentRequest(postVals)' "); 

     Logging.WriteLog("_client.RecordPaymentWithRequest start"); 
     var receipt = _client.RecordPaymentWithRequest(paymentReq); 
     Logging.WriteLog("Running _client.RecordPaymentWithRequest complete"); 
     var retval = PartialView(receipt.Duplicate ? "Duplicate Receipt" : "Receipt", receipt); 
     Logging.WriteLog(string.Format("retval: {0}", retval)); 
     return retval; 
     } 
     catch (Exception ex) 
     { 
     Logging.WriteException(ex); 
     throw; 
     } 
     finally 
     { 
     Logging.WriteLog(control, "End RegisterNewAccountEmail"); 

     try 
     { 
      using (var sw = new StreamWriter(@"C:\LOGS\RECEIPTLOG.TXT", true)) 
      { 
      sw.WriteLine("Stop Receipt: " + DateTime.Now); 
      } 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("error:" + ex.Message); 
     } 

     } 
    } 

這是在我的日誌結束:

------------------------------------------- 
Start Receipt: 1/14/2014 7:17:07 AM 
Browser: internetexplorer 
Browser Version: 11.0 
Request.UserHostAddress: xxx.xxx.xxx.xxx 
Request.UrlReferrer: website url here 
Stop Receipt: 1/14/2014 7:17:07 AM 

正如你可以看到有沒有被寫入標題信息。

我要對這個錯誤後的數據轉儲到一個日誌文件?如果沒有,爲什麼我的標題信息沒有寫入日誌?

**更新**

我第一個的try/catch內將此添加到我的日誌:

sw.WriteLine("Request.Headers.Keys.Count: " + Request.Headers.Keys.Count); 

,這是結果:

Request.Headers.Keys.Count: 11 
+0

您確定要發佈嗎? GET請求沒有主體。什麼是'Request.ContentLength'? – spender

+0

調試你的代碼 - headerValues中是否有任何值?另外,請確保您發佈數據:將POST屬性添加到您的操作中。 –

+0

我添加了附加信息,keys.count是11.我認爲這意味着有發佈數據? – ErocM

回答

1

使用Request.Headers .AllKeys而不是Keys。

AllKeys返回一個字符串數組這是你想要的。
Keys返回a NameObjectCollectionBase.KeysCollection Class

+0

'foreach(Request.Headers.AllKeys中的var headerKey)'這是正確的嗎?如果是這樣,它仍然沒有輸出。 – ErocM

+0

[它應該工作](http://stackoverflow.com/questions/2628584/how-to-dump-asp-net-request-headers-to-string),標題屬性的文檔頁面也有一個[示例](http://msdn.microsoft.com/en-us/library/system.web.httprequest.headers.aspx)他們在哪裏做你想要的。 – Rui

+0

我改變了循環使用你給的例子,它的工作!謝謝! – ErocM