代码之家  ›  专栏  ›  技术社区  ›  xyz

在标题C中设置If匹配#

  •  1
  • xyz  · 技术社区  · 8 年前

    我有Odata服务,为了执行PUT,我们需要用 If-Match: * 在Post man中,我像下面这样给予,这很有效

    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

    OData版本:4.0 设置Cookie:JSESSIONID=XYZ;路径=/;保护仅限HTTPS 设置Cookie:XYZ;路径=/;安全;仅限HTTPS 服务器:Apache Coyote/1.1 更改:接受编码 连接:保持活动 内容类型:application/json;奥达塔。元数据=最小 }}系统。网Http。HttpResponseMessage`

    1 回复  |  直到 6 年前
        1
  •  3
  •   ProgrammingLlama Raveena Sarda    8 年前

    您的“请求”对象是您的内容对象,而不是HttpRequestMessage对象。我是怎么意识到的?ContentType在HttpRequestMessage上不可用。

    If-Match 不是一个内容级标题(我不知道为什么微软会这样区分)。您不能将其添加到此处,必须将其添加到请求标头。如果将其添加到内容对象,则会忽略它。

    像这样的事情应该会奏效:

    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);