我有 Odata 服务,为了执行 PUT,我们需要用 If-Match: *
设置 Header
如何在 Odata 服务调用中设置此 If-Match 以执行 PUT 操作。我尝试了以下操作
private async Task<HttpResponseMessage> PutJsonAsync(string messageBody,string B_Code)
{
string userName = ConfigurationManager.AppSettings["Username"];
string password = ConfigurationManager.AppSettings["Password"];
string BaseURL = ConfigurationManager.AppSettings["BaseURL"];
try
{
using (var httpClient = new HttpClient())
{
var request = new StringContent(messageBody, Encoding.UTF8, "application/json");
string apiUrl = "SAM('" + B_Code + "')";
request.Headers.ContentType = new MediaTypeHeaderValue("application/json");
request.Headers.TryAddWithoutValidation("If-Match", "*");
var url = string.Format("{0}{1}", BaseURL, apiUrl);
var creds = userName + ":" + password;
var credentials = Encoding.ASCII.GetBytes(creds);
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(credentials));
response = await httpClient.PutAsync(new Uri(url), request);
}
}
catch (Exception ex)
{
throw ex;
}
return response;
}
但它不工作并抛出错误 501:Not Implemented
`response {StatusCode: 501, ReasonPhrase: 'Not Implemented', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:
OData 版本:4.0 日期:2017 年 10 月 30 日星期一 20:42:28 GMT 设置 Cookie:JSESSIONID=XYZ;路径=/;安全的;仅限HTTP 设置 Cookie:XYZ;PATH=/;安全;HTTPONLY 服务器:Apache-Coyote/1.1 变化:接受编码 连接:保持事件状态 内容长度:277 内容类型:application/json; odata.metadata=最小 }} System.Net.Http.HttpResponseMessage`
最佳答案
您的“请求”对象是您的内容对象,而不是 HttpRequestMessage 对象。我是怎么意识到的? ContentType 在 HttpRequestMessage 上不可用。
If-Match
不是内容级 header (我不知道微软为什么要进行这种区分)。这里不能加,必须加在请求头中。如果将它添加到内容对象,它将被忽略。
像这样的东西应该可以工作:
string apiUrl = "SAM('" + B_Code + "')";
var url = string.Format("{0}{1}", BaseURL, apiUrl);
var creds = userName + ":" + password;
var credentials = Encoding.ASCII.GetBytes(creds);
var request = new HttpRequestMessage(HttpMethod.Put, new Uri(url));
request.Content = new StringContent(messageBody, Encoding.UTF8, "application/json");
request.Headers.TryAddWithoutValidation("If-Match", "*");
request.Headers.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(credentials));
response = await httpClient.SendAsync(request);
关于c# - 在标题 C# 中设置 If-Match,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47028022/