【问题标题】:Post method returns "The requested resource does not support http method 'GET'.\" after adding authorization on Azure在 Azure 上添加授权后,Post 方法返回“请求的资源不支持 http 方法 'GET'.\”
【发布时间】:2016-10-04 15:15:00
【问题描述】:

我们创建了 Web 服务,可以发布一些数据,修改它并以 json 格式发回。入口方法有 System.Web.Http.HttpPost 属性

    [HttpPost]
    public object Index(dynamic input)
    {
     // return modified data;
    }

它工作正常,但我们想做一些自动测试。为了使它成为可能,我们在 azure 上发布了网站。但是,为了限制访问 Azure Active Directory 身份验证是在服务上配置的。 没有对代码进行任何更改。只有 Web 应用程序/API 应用程序使用密钥在 Active Directory 中注册。然后在服务认证/授权配置中添加了客户端。

从使用 ADAL 库的代码中,我获得了访问令牌。使用它我可以成功调用 get 方法(服务还有另一个 get 条目,但本地路径不同)

   HttpClient httpClient = new HttpClient();
   httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(
   result.AccessTokenType, result.AccessToken);
   var uriString = @"http://myService.azurewebsites.net/api/MyGetMethod";
   Uri uri = new Uri(uriString);
   HttpResponseMessage httpResponse = await httpClient.GetAsync(uri);
   if (httpResponse.IsSuccessStatusCode)
   {
      return await httpResponse.Content.ReadAsStringAsync();
   }

但是当我尝试对 post 方法做同样的事情时,我得到了回应:

{StatusCode: 405, ReasonPhrase: 'Method Not Allowed' "{\"Message\":\"请求的资源不支持http方法'GET'。 \"}"

以下用于发布消息的代码:

  HttpClient httpClient = new HttpClient();
  httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(result.AccessTokenType, result.AccessToken);
  httpClient.DefaultRequestHeaders.Accept.Add(
  new MediaTypeWithQualityHeaderValue("application/json"));
  var stringContent = new StringContent("{MyData: 5.4}");
  stringContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
  var response = await httpClient.PostAsync("http://myService.azurewebsites.net/api/MyPostMethod", stringContent).Result;
  if (response.IsSuccessStatusCode) {
     return await response.Content.ReadAsStringAsync();}

【问题讨论】:

    标签: asp.net rest azure active-directory


    【解决方案1】:

    根据描述,您已使用 Azure 广告保护了 Web 服务,并且您能够成功发送 GET 请求。

    从错误消息来看,问题与 Web 服务有关。这是一个适合我的示例:

    // POST api/values
    public void Post([FromBody]Message value)
    {
    
    }
    
    public class Message
    {
         public Double MyData;
    }
    

    如果问题仍然存在,您可以分享 Web 服务代码帮助以缩小此问题的范围。

    更新

    您上传的代码示例对我来说效果很好,无论是否使用 Azure AD 进行身份验证,请查看下面的测试请求,看看它是否有帮助:

    要将 Web API 与 Azure AD 集成,您还可以参考代码示例here

    【讨论】:

    • 之前不能回复,今天又查了一下。然而,这一次我使用 httpGetAttribute 添加到控制器的第二种方法。这次服务回复但来自 get 方法。虽然我发送帖子消息,但天蓝色“重定向”它来获取。通过“post”方法在本地运行服务应答。
    • 如果你能上传一个demo项目会很有帮助。您可以从OneDrive上传,上传前请删除敏感信息。
    • 我创建了简单的网络应用程序。当身份验证关闭时,我的服务返回:“来自 Post”。当启用 azure 身份验证时,我得到:“方法获取返回”该应用位于 OneDrive:
    猜你喜欢
    • 1970-01-01
    • 2012-09-27
    • 2014-01-28
    • 2018-06-24
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 2015-10-08
    • 2017-03-31
    相关资源
    最近更新 更多