这是此帖的后续内容:New at MVC 4 Web API Confused about HTTPRequestMessage
以下是我要做的事情的摘要:有一个我想通过MVC 4 Web API与之交互的网站。在该站点,用户可以使用用户名和密码登录,然后转到名为“原始数据”的链接以查询站点中的数据。
在“原始数据”页面上,有一个“设备”的下拉列表,一个“发件人”日期的文本框和一个“收件人”日期的文本框。给定这三个参数,用户可以单击“获取数据”按钮,并将数据表返回到页面。我必须做的是在Azure上托管一项服务,该服务将以编程方式为站点提供这三个参数的值,并将CSV文件从站点返回到Azure存储。
托管该网站的公司提供了以编程方式与网站连接的文档,以检索此原始数据。该文档描述了如何针对其云服务提出请求。必须使用自定义HTTP身份验证方案对请求进行身份验证。以下是身份验证方案的工作原理:
我要列出的代码是在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
首先让我介绍一下这个功能:
在下一步中,根据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;
}
我还没有在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")
};
我不确定采用这部分代码的方法。
感谢您的帮助。