使用MVC 4 Web API从网站获取数据

时间:2013-02-12 03:40:42

标签: asp.net-mvc asp.net-mvc-4 asp.net-web-api

这是此帖的后续内容:New at MVC 4 Web API Confused about HTTPRequestMessage

以下是我要做的事情的摘要:有一个我想通过MVC 4 Web API与之交互的网站。在该站点,用户可以使用用户名和密码登录,然后转到名为“原始数据”的链接以查询站点中的数据。

在“原始数据”页面上,有一个“设备”的下拉列表,一个“发件人”日期的文本框和一个“收件人”日期的文本框。给定这三个参数,用户可以单击“获取数据”按钮,并将数据表返回到页面。我必须做的是在Azure上托管一项服务,该服务将以编程方式为站点提供这三个参数的值,并将CSV文件从站点返回到Azure存储。

托管该网站的公司提供了以编程方式与网站连接的文档,以检索此原始数据。该文档描述了如何针对其云服务提出请求。必须使用自定义HTTP身份验证方案对请求进行身份验证。以下是身份验证方案的工作原理:

  1. 从用户密码计算MD5哈希值。
  2. 将请求行附加到第一步的值的末尾。
  3. 在第二步中将日期标题附加到值的末尾。
  4. 将邮件正文(如果有)附加到步骤3中值的末尾。
  5. 计算步骤4中结果值的MD5哈希值。
  6. 使用“:”字符作为分隔符,将步骤5中的值附加到用户电子邮件中。
  7. 使用步骤6中的值计算Base64。
  8. 我要列出的代码是在Visual Studio 2012,C#,.NET Framework 4.5中完成的。这篇文章中的所有代码都在我的'FileDownloadController.cs'Controller类中。 'getMd5Hash'函数接受一个字符串,并返回一个MD5哈希:

    //Create MD5 Hash:  Hash an input string and return the hash as a 32 character hexadecimal string. 
        static string getMd5Hash(string input)
        {
            // Create a new instance of the MD5CryptoServiceProvider object.
            MD5CryptoServiceProvider md5Hasher = new MD5CryptoServiceProvider();
    
            // Convert the input string to a byte array and compute the hash. 
            byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input));
    
            // Create a new Stringbuilder to collect the bytes 
            // and create a string.
            StringBuilder sBuilder = new StringBuilder();
    
            // Loop through each byte of the hashed data  
            // and format each one as a hexadecimal string. 
            for (int i = 0; i < data.Length; i++)
            {
                sBuilder.Append(data[i].ToString("x2"));
            }
    
            // Return the hexadecimal string. 
            return sBuilder.ToString();
        }
    

    此函数接受一个字符串,并返回BASE64:

            //Convert to Base64
        static string EncodeTo64(string input)
        {
            byte[] str1Byte = System.Text.Encoding.ASCII.GetBytes(input);
            String plaintext = Convert.ToBase64String(str1Byte);
    
            return plaintext;
        }
    

    下一个函数创建一个HTTPClient,生成一个HTTPRequestMessage,并返回授权。注意:以下是从“原始数据”页面返回数据时从Fiddler返回的URI:GET / rawdata / exportRawDataFromAPI /?devid = 3188&amp; fromDate = 01-24-2013&amp; toDate = 01-25-2013 HTTP / 1.1

    首先让我介绍一下这个功能:

    1. 'WebSiteAuthorization'功能采用'deviceID','fromDate','toDate'和'password'。
    2. 接下来,我宣布了三个变量。我不清楚我是否需​​要'消息体',但我有这个设置的通用版本。其他两个变量包含URI的开头和结尾。
    3. 我有一个名为'dateHeader'的变量,它保存数据头。
    4. 接下来,我尝试创建一个HTTPClient,为其分配带参数的URI,然后将“application / json”指定为媒体类型。我还不太清楚如何构建它。
    5. 在下一步中,根据API文档的要求创建授权,然后返回结果。

      public static string WebSiteAuthorization(Int32 deviceid, string fromDate, string toDate, string email, string password)
      {
          var messagebody = "messagebody"; // TODO: ??????????? Message body
          var uriAddress = "GET/rawdata/exportRawDataFromAPI/?devid=";
          var uriAddressSuffix = "HTTP/1.1";
      
          //create a date header
          DateTime dateHeader = DateTime.Today;
          dateHeader.ToUniversalTime();
      
          //create the HttpClient, and its BaseAddress
          HttpClient ServiceHttpClient = new HttpClient();
          ServiceHttpClient.BaseAddress = new Uri(uriAddress + deviceid.ToString() + " fromDate" + fromDate.ToString() + " toDate" + toDate.ToString() + uriAddressSuffix);
          ServiceHttpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
      
          //create the authorization string
          string authorizationString = getMd5Hash(password);
          authorizationString = authorizationString + ServiceHttpClient + dateHeader + messagebody;
          authorizationString = email + getMd5Hash(authorizationString);
          authorizationString = EncodeTo64(authorizationString);
      
          return authorizationString;
      
      }
      
    6. 我还没有在Azure上测试过这个。我还没有完成获取文件的代码。我知道我需要做的一件事是确定创建HttpRequestMessage的正确方法并使用HttpClient发送它。在我阅读的文档和我看过的示例中,以下代码片段似乎是可能的方法:

      Var serverAddress = http://my.website.com/;
      //Create the http client, and give it the ‘serverAddress’:
      Using(var httpClient = new HttpClient()
      {BaseAddress = new Uri(serverAddress)))
      Var requestMessage = new HttpRequestMessage();
      Var objectcontent = requestMessage.CreateContent(base64Message, MediaTypeHeaderValue.Parse          (“application/json”)
      

      或----

      var formatters = new MediaTypeFormatter[] { new jsonMediaTypeFormatter() }; 
      HttpRequestMessage<string> request = new HttpRequestMessage<string>
      ("something", HttpMethod.Post, new Uri("http://my.website.com/"), formatters); 
      
      request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); 
      
      var httpClient = new HttpClient(); 
      var response = httpClient.SendAsync(request);
      

      或------

      Client = new HttpClient();
      var request = new HttpRequestMessage
                       {
                           RequestUri = "http://my.website.com/",
                           Method = HttpMethod.Post,
                           Content = new StringContent("ur message")
                       };
      

      我不确定采用这部分代码的方法。

      感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

逐步阅读this tutorial以了解基本信息。