我正在尝试发布到使用基本身份验证的Web API。当我使用Fiddler进行POST时,我能够成功发布数据。现在我试图在C#控制台应用程序中做同样的事情,但我仍然得到401未经授权的响应。在代码中发布到Web API返回“未授权”
当我通过调试运行代码时,我可以播种凭证正在正确获取Base64编码。在网上做一些研究,我相信我有正确的代码。任何人看到我是否错过了什么?
if (lstEmployee != null && lstEmployee.Count > 0)
{
try
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("https://website.com/api/employees/upload";);
//set credentials and add them to the client header
string credentials = Convert.ToBase64String(Encoding.Default.GetBytes("username:password"));
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", credentials);
//set to use JSON
client.DefaultRequestHeaders.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
foreach (var employee in lstEmployee)
{
//Convert to JSON with Newtonsoft
string employeeJSON = JsonConvert.SerializeObject(employee);
HttpResponseMessage response = client.PostAsJsonAsync(fullServiceURL, employeeJSON).Result;
if (response.IsSuccessStatusCode)
{
//If successfull, do something.
}
else
{
logger.Error("Error posting to Web API. Employee: {0} | {1} ({2})", employee.EmployeeNumber, (int)response.StatusCode, response.ReasonPhrase);
}
}
}
}
catch (Exception ex)
{
logger.Error("Error posting to Web API. | {0} | Trace: {1}", ex.Message, ex.StackTrace);
}
}
else
{
logger.Info("No records found.");
}
在菲德勒我只是添加了以下到作曲家选项卡中的头与身体中的一些JSON数据一起和它的工作。
Authorization: Basic abChaXJ3YXlzLmludGVncmF0aW9uOnRlc3Q0ZGNhYTIwMTU=
Host: services.website.com
Content-Length: 374
Content-Type: application/json; charset=utf-8
**更新**
我调整了代码如下。现在,我收到错误状态400“错误请求”。它似乎在抱怨数据格式不正确。但是,我记录了JSON列表值并将其添加到Fiddler的主体中。我可以在Fiddler中发布捕获的JSON就好了。我不知道还有什么要检查的,看看它有什么问题。
这是我的JSON列表经过Newtonsoft后的结果。我只拉用于测试目的
[{"EmployeeNumber":"22449","CompanyHireDate":"2014-12-15T00:00:00","Username":"EN022449","LastName":"AVIVA","FirstName":"JOE","MiddleInitial":null,"BirthDate":"1967-10-06T00:00:00","PhoneNumber":null,"EmailAddress":"[email protected]","Location":"BOS","Address1":null,"Address2":null,"City":null,"State":null,"Zip":null,"OverrideSeniorityOrder":0}]
这是我更新的代码的一个记录:
if (lstEmployee != null && lstEmployee.Count > 0)
{
logger.Info("Employee count: " + lstEmployee.Count);
string baseUrl = "https://services.website.com/api/";
string serviceUrl = "employees/upload";
string fullServiceURL = baseUrl + serviceUrl;
logger.Debug("Web API Uri: " + fullServiceURL);
try
{
//Convert the list to JSON
string employeeJSON = JsonConvert.SerializeObject(lstEmployee);
logger.Debug("employeeJSON: " + employeeJSON);
//Add credentials to Client Handler
var credentials = new NetworkCredential("username", "password");
var handler = new HttpClientHandler { Credentials = credentials };
using (var client = new HttpClient(handler))
{
//set URI and to use JSON
client.BaseAddress = new Uri(fullServiceURL);
client.DefaultRequestHeaders.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response = client.PostAsJsonAsync(fullServiceURL, employeeJSON).Result;
if (response.IsSuccessStatusCode)
{
//success
}
else
{
logger.Error("Error posting to Web API. {0} ({1})", (int)response.StatusCode, response.ReasonPhrase);
}
}
}
catch (Exception ex)
{
logger.Error("Error posting to Web API. | {0} | Trace: {1}", ex.Message, ex.StackTrace);
}
}
else
{
logger.Info("No records found.");
}
在设置授权标头后,您可以这样做:'client.DefaultRequestHeaders.Clear();'可以付费重新排序操作。 –
谢谢。这让我更加接近。我也应该看到这一点,但一遍又一遍地看后,我错过了这一点。我收到了一个不同的错误,但至少它不是未经授权的。 – Caverman
什么是新错误?用相关细节更新你的问题。 –