为什么我的 C# 控制台应用程序中总是收到错误请求,但邮差在 NTLM 授权下工作正常
private static string APIUrl = "http://201.881.xxx.xx:1047/UATDB/WS/Leo/Codeunit/WebApi";
public static async Task GetDataWithAuthentication()
{
var authCredential = Encoding.UTF8.GetBytes("{apitest}:{apitest}");
CredentialCache credentials = new CredentialCache();
credentials.Add(new Uri(APIUrl), "NTLM", new NetworkCredential("apitest", "apitest", ""));
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml"));
client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("NTLM", Convert.ToBase64String(Encoding.UTF8.GetBytes(credentials.ToString())));
client.DefaultRequestHeaders.Add("Soapaction", "urn:microsoft-dynamics-schemas/codeunit/WebApi");
client.BaseAddress = new Uri(APIUrl);
string soapString = @"<?xml version=""1.0"" encoding=""utf-8""?>
<soap:Envelope xmlns=""http://schemas.xmlsoap.org/soap/envelope/"">
<soap:Body>
<GetCustomer xmlns=""urn:microsoft-dynamics-schemas/codeunit/WebApi"">
<customerNo></customerNo>
<xCustomer>
<Customer xmlns=""urn:microsoft-dynamics-nav/xmlports/x50007"">
</Customer>
</xCustomer>
</GetCustomer>
</soap:Body>
</soap:Envelope>";
StringContent content = new StringContent(HttpUtility.UrlEncode(soapString), Encoding.UTF8, "application/x-www-form-urlencoded");
List<KeyValuePair<string, string>> requestData = new List<KeyValuePair<string, string>>();
requestData.Add(new KeyValuePair<string, string>("grant_type", content.ToString()));
FormUrlEncodedContent requestBody = new FormUrlEncodedContent(requestData);
var requestUrl = client.PostAsync(client.BaseAddress, requestBody).Result;
requestUrl.Content = content;
if (requestUrl.IsSuccessStatusCode)
{
var result = requestUrl.Content.ReadAsStringAsync().Result;
}
HttpResponseMessage response = await client.GetAsync(client.BaseAddress);
response.Content = content;
if (response.IsSuccessStatusCode)
{
var readTask = response.Content.ReadAsStringAsync().ConfigureAwait(false);
var rawResponse = readTask.GetAwaiter().GetResult();
Console.WriteLine(rawResponse);
}
else
{
Console.WriteLine("{0}\n{1}", response.StatusCode, response.RequestMessage);
}
Console.WriteLine("Complete");
}
}
private static string APIUrl = "http://201.881.xxx.xx:1047/UATDB/WS/Leo/Codeunit/WebApi";
public static async Task GetDataWithAuthentication()
{
var authCredential = Encoding.UTF8.GetBytes("{apitest}:{apitest}");
CredentialCache credentials = new CredentialCache();
credentials.Add(new Uri(APIUrl), "NTLM", new NetworkCredential("apitest", "apitest", ""));
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml"));
client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("NTLM", Convert.ToBase64String(Encoding.UTF8.GetBytes(credentials.ToString())));
client.DefaultRequestHeaders.Add("Soapaction", "urn:microsoft-dynamics-schemas/codeunit/WebApi");
client.BaseAddress = new Uri(APIUrl);
string soapString = @"<?xml version=""1.0"" encoding=""utf-8""?>
<soap:Envelope xmlns=""http://schemas.xmlsoap.org/soap/envelope/"">
<soap:Body>
<GetCustomer xmlns=""urn:microsoft-dynamics-schemas/codeunit/WebApi"">
<customerNo></customerNo>
<xCustomer>
<Customer xmlns=""urn:microsoft-dynamics-nav/xmlports/x50007"">
</Customer>
</xCustomer>
</GetCustomer>
</soap:Body>
</soap:Envelope>";
StringContent content = new StringContent(HttpUtility.UrlEncode(soapString), Encoding.UTF8, "application/x-www-form-urlencoded");
List<KeyValuePair<string, string>> requestData = new List<KeyValuePair<string, string>>();
requestData.Add(new KeyValuePair<string, string>("grant_type", content.ToString()));
FormUrlEncodedContent requestBody = new FormUrlEncodedContent(requestData);
var requestUrl = client.PostAsync(client.BaseAddress, requestBody).Result;
requestUrl.Content = content;
if (requestUrl.IsSuccessStatusCode)
{
var result = requestUrl.Content.ReadAsStringAsync().Result;
}
HttpResponseMessage response = await client.GetAsync(client.BaseAddress);
response.Content = content;
if (response.IsSuccessStatusCode)
{
var readTask = response.Content.ReadAsStringAsync().ConfigureAwait(false);
var rawResponse = readTask.GetAwaiter().GetResult();
Console.WriteLine(rawResponse);
}
else
{
Console.WriteLine("{0}\n{1}", response.StatusCode, response.RequestMessage);
}
Console.WriteLine("Complete");
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论