【问题标题】:405 method not found error when web api call from device从设备调用 Web api 时出现 405 方法未找到错误
【发布时间】:2017-12-14 06:20:45
【问题描述】:

当我从设备或模拟器上的 xamarin 移动应用程序调用 Web API 时,出现 405 方法未找到错误。

当我从邮递员那里调用时,web api 运行成功。

此错误仅适用于 POST 方法。

有人知道吗?

请提出建议。

编辑:

public async Task Request(string url, string contents, HttpMethod methodType, string mediaStream = "application/json", bool isTokenNeeded = true)
{
    bool isSuccessRequest = true;
    string responseBodyAsText;

    try
    {
        if (!Utility.IsServiceAvailable)
        {
            OnError?.Invoke(new ErrorData
            {
                ErrorText = SystemMessages.OfflineServer
            });
            return;
        }

        HttpClientHandler handler = new HttpClientHandler();
        using (HttpClient httpClient = new HttpClient(handler))
        {
            HttpRequestMessage message = new HttpRequestMessage(methodType, url);

            if (methodType == HttpMethod.Post)
            {
                message.Headers.ExpectContinue = false;
                message.Content = new StringContent(contents);
                // message.Content.Headers.ContentLength = contents.Length;
                message.Content.Headers.ContentType = new MediaTypeHeaderValue(mediaStream);
            }

            // Add accesstoken to request header
            if (isTokenNeeded)
                httpClient.DefaultRequestHeaders.Add("Authorization", "Bearer " + ApplicationConfiguration.Token.AccessToken);

            httpClient.Timeout = new TimeSpan(0, 0, 10, 0, 0);

            HttpResponseMessage response = await httpClient.SendAsync(message);
            if (response.StatusCode == System.Net.HttpStatusCode.NotFound)
            {
                var error = new ErrorData() { ErrorText = SystemMessages.OfflineServer };
                OnError?.Invoke(error);
                return;
            }
            else if (response.StatusCode == System.Net.HttpStatusCode.BadRequest)
            {
                responseBodyAsText = response.Content.ReadAsStringAsync().Result;
                var error = JsonConvert.DeserializeObject<ErrorData>(responseBodyAsText);
                OnError?.Invoke(error);
                return;
            }
            else if (response.StatusCode == System.Net.HttpStatusCode.Unauthorized)
            {
                responseBodyAsText = response.Content.ReadAsStringAsync().Result;
                var error = JsonConvert.DeserializeObject<ErrorData>(responseBodyAsText);
                OnError?.Invoke(error);
                return;
            }
            else
            {
                response.EnsureSuccessStatusCode();
                responseBodyAsText = response.Content.ReadAsStringAsync().Result;
            }
        }
    }
    catch (HttpRequestException hre)
    {
        responseBodyAsText = "Exception : " + hre.Message;
        isSuccessRequest = false;
        OnError?.Invoke(new ErrorData
        {
            ErrorText = hre.Message
        });
    }
    catch (Exception ex)
    {
        responseBodyAsText = "Exception : " + ex.Message;
        isSuccessRequest = false;
        OnError?.Invoke(new ErrorData
        {
            ErrorText = ex.Message
        });
    }
}

【问题讨论】:

  • 如果没有看到任何代码就很难判断。
  • @PaulKertscher 请检查我的编辑。
  • downvoter 关心解释一下:|
  • 一些需要检查的事情:URL 和数据是否正确?如果需要身份验证:是否有有效的访问令牌?您是否正确传递了访问令牌?方法正确吗?
  • 我投了反对票,因为我认为这不是一个很好的问题。添加代码后,它开始变得更好,但您真的应该将其剥离为minimal reproducible example。来电者网站也很高兴看到。

标签: asp.net-web-api xamarin.forms


【解决方案1】:

我把web.config中的cookieless="AutoDetect"改成了cookieless="UseCookies",问题就解决了。

【讨论】:

    【解决方案2】:

    405 是一个服务器响应,通知您目标资源不支持该方法(POSTGETPUT、...)

    请求行中收到的方法是源服务器已知的,但目标资源不支持

    (Source)

    如果您的 Web API 配置正确,我想您使用错误的方法调用了 API,例如POST 应该是 GET 或其他方式。

    【讨论】:

    • @NeelamPrajapati - 405 是服务器响应。您不能告诉我您的请求完全相同,但您的服务器仍然响应不同。
    • 是的。它是actlay..还有一件事我想提及。该网络服务托管在本地 iis 中。
    猜你喜欢
    • 2016-04-21
    • 2021-09-21
    • 2019-03-20
    • 1970-01-01
    • 2017-04-27
    • 1970-01-01
    • 2019-01-30
    • 2015-06-20
    • 1970-01-01
    相关资源
    最近更新 更多