c# - 在标题 C# 中设置 If-Match

标签 c# asp.net-web-api http-headers odata

我有 Odata 服务,为了执行 PUT,我们需要用 If-Match: * 设置 Header

enter image description here

如何在 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/

相关文章:

c# - 如何获得枚举自定义值?

c# - 如何在新线程上运行任务并立即返回给调用者?

c# - 多个 Access-Control-Allow-Origin header

security - 使用HTTP header 的Spring Security

c# - 过滤异常处理程序中的代码在访问异常时抛出 NullReferenceException

c# - 如何创建一个在特定时间自动发送电子邮件的独立程序?

c# - 生成由操作过滤器控制的 PDF?

javascript - 具有单值和 AngularJs $http json 处理的 WebApi 方法

java - 需要捕获代理后面的客户端ip地址

Python 中的 Java setRequestHeader