2014-04-04 39 views
1

我正在开发一个.Net客户端来从oData服务中检索数据。我的客户使用System.Data.Services.Client.DataServiceContext。如何通过SSL跟踪.Net DataServiceContext中的oData请求?

我想看到实际的oData请求发送到服务器。服务器使用SSL连接,并且对服务器的请求不容易被嗅探。我试图用Burp来做到这一点。我添加了一个SendingRequest EventHandler并设置了Request.Proxy属性。但是,这给出了一个例外:

底层连接已关闭:无法建立SSL/TLS安全通道的信任关系。

Wireshark只显示加密数据。

另外,我可以联系OData提供商的服务器日志,但这需要一些时间。我正在寻找一个瞬间的痕迹。


以下是使用Microsoft Northwind oData服务的示例客户端。

  1. 创建一个类库;
  2. 添加服务推荐到Northwind;
  3. 创建一个类oDataClient;
  4. 添加方法Customers();
  5. 创建测试项目;
  6. 在其中创建一个单元测试Customers();
  7. 运行测试。

方法:

public class oDataClient 
{ 
    public void Customers() 
    { 
     { 
      var context = new Northwind.NorthwindEntities(new System.Uri("http://services.odata.org/V3/Northwind/Northwind.svc/")); 

      var customers = from c in context.Customers 
          where c.CompanyName.StartsWith("A") 
          select c; 

      int count = customers.Count(); 
     } 
    } 
} 

测试:

[TestMethod()] 
public void CustomersTest() 
{ 
    oDataClient target = new oDataClient(); 
    target.Customers(); 
} 

回答

1

您可以使用SendingRequest2,ReceivingResponse事件来追踪客户端的出局OData请求。有关更多详细信息,请参阅以下示例

using Microsoft.OData.Client; 
using Simple.OData.Client; 
using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace ODataClientApp 
{ 
    class Program 
    { 
     private static string fileName = "TraceLog.log"; 
     private static Default.Container container; 
     static void Main(string[] args) 
     { 
      try 
      { 
       var uri = "http://localhost:32097/odata"; 
       container = new Default.Container(new Uri(uri)); 

       container.SendingRequest2 += Container_SendingRequest2; 
       container.ReceivingResponse += Container_ReceivingResponse; 
       var moviles = container.Movies.Execute().ToList(); 
      } 
      catch(Exception ex) 
      { 
       Console.WriteLine(ex.Message); 
       Console.ReadLine(); 
      } 
     } 

     private static void Container_SendingRequest2(object sender, Microsoft.OData.Client.SendingRequest2EventArgs e) 
     { 
      var request = e.RequestMessage as HttpWebRequestMessage; 
      var x = container; 
      var url = request.Url.AbsoluteUri; 
      var method = request.Method; 
      var authenticationLevel = request.HttpWebRequest.AuthenticationLevel; 
      var impersonationLevel = request.HttpWebRequest.ImpersonationLevel.ToString(); 
      var headers = request.Headers; 
      var sb = new StringBuilder(); 
      sb.AppendLine(DateTime.Now.ToString() + "------------------------------SendingRequest2 Begin---------------------------"); 
      sb.AppendLine("Url:" + url); 
      sb.AppendLine("Method:" + method); 
      sb.AppendLine("Authentication Level:" + authenticationLevel); 
      sb.AppendLine("Impersonation Level:" + impersonationLevel); 
      sb.AppendLine(); 
      sb.AppendLine("Header Info:-"); 
      foreach (var header in headers) 
      { 
       sb.AppendFormat("{0}:{1}", header.Key, header.Value); 
       sb.AppendLine(); 
      } 
      sb.AppendLine(DateTime.Now.ToString() + "------------------------------SendingRequest2 End-----------------------------"); 
      File.AppendAllText(fileName, sb.ToString()); 
     } 
     private static void Container_ReceivingResponse(object sender, Microsoft.OData.Client.ReceivingResponseEventArgs e) 
     { 
      var response = e.ResponseMessage as HttpWebResponseMessage; 
      var statusCode = response.StatusCode.ToString(); 
      var headers = response.Headers; 

      var sb = new StringBuilder(); 
      sb.AppendLine(DateTime.Now.ToString() + "------------------------------ReceivingResponse Begin-------------------------"); 
      sb.AppendLine("Status Code:" + statusCode); 
      sb.AppendLine(); 
      sb.AppendLine("Header Info:-"); 
      foreach (var header in headers) 
      { 
       sb.AppendFormat("{0}:{1}", header.Key, header.Value); 
       sb.AppendLine(); 
      } 
      sb.AppendLine(DateTime.Now.ToString() + "------------------------------ReceivingResponse End---------------------------"); 
      File.AppendAllText(fileName, sb.ToString()); 
     } 
    } 
} 
1

虽然写下这个问题,并创建示例客户端,我突然注意到,提交到服务器的实际要求不隐藏的很深在.Net库中,但可以轻松观看!

如果您运行测试并遍历代码,在查询上下文之后,对象客户只是简单地显示url。在这种情况下:

http://services.odata.org/V3/Northwind/Northwind.svc/Customers()?$filter=startswith(CompanyName,'A') 

它实际上是底层基类DataServiceQuery实例的RequestUri属性。

所以,我希望这个答案对于像我这样的人来说是有用的。