【问题标题】:Azure Mobile Services Custom API Getting Bad Request on ClientAzure 移动服务自定义 API 在客户端收到错误请求
【发布时间】:2016-02-13 16:17:40
【问题描述】:

所以我正在使用 azure 移动服务后端来尝试制作自定义 API。但是,我似乎无法从客户端连接到模板表。当您使用模板创建新的 Azure 移动服务时,它们会为您提供类似于此格式的 values API 控制器

[MobileAppController]
public class ValuesController : ApiController
{
    // GET api/values
    [Route("api/values")]
    public string Get()
    {
        return "test";
    }
}

从客户端我尝试像这样调用这个端点

var result = mobileService.InvokeApiAsync<string>("values", HttpMethod.Get, null).Result;

由于某种原因,我不断收到此异常

{"The request could not be completed. (Bad Request)"}

{Method: GET, RequestUri: 'http://localhost:58457/api/values', Version: 1.1, Content: <null>, Headers: { X-ZUMO-FEATURES: AT X-ZUMO-INSTALLATION-ID: b04f4e19-4f41-46ed-9767-9c1352037559 Accept: application/json User-Agent: ZUMO/1.3 User-Agent: (lang=Managed; os=Windows; os_version=6.1.65536.7601; arch=Win32NT; version=1.3.30324.0) X-ZUMO-VERSION: ZUMO/1.3 (lang=Managed; os=Windows; os_version=6.1.65536.7601; arch=Win32NT; version=1.3.30324.0) }}

这也只是模板,所以在我启动并运行任何自定义端点之前,我需要它来工作。关于问题可能是什么的任何想法?

【问题讨论】:

  • 你能通过 fiddler 或 postman 发出同样的请求吗?您仍然收到 400 响应吗?看起来您正在尝试访问 localhost:58457 ......这是正确的,对吧?
  • 使用 HTTP 客户端时,我会收到关于缺少请求中的 Zumo 标头的错误。新的移动服务现在似乎需要这样做
  • @DillonDrobena 我在下面的回答对你也有用吗?
  • @RamiSarieddine 不幸的是,我没有尝试您的解决方案,因为我遇到的问题与我选择的答案直接相关。我只是使用了错误的包。一旦我升级它,一切就完美了。如果这与版本检查有关,除非我再次降级软件包,否则我无法确定。

标签: azure asp.net-web-api2 azure-mobile-services


【解决方案1】:

您可以通过将应用设置 MS_SkipVersionCheck 的值设置为 true 来选择退出版本检查。在 web.config 或 Azure 门户的“应用程序设置”部分中指定此项。 ms_skipversion 在门户中检查为 true。

【讨论】:

  • 感谢@freethinker6
【解决方案2】:

您说的是 Mobile Service,但您使用的控制器是 MobileAppController。

这表明您实际上正在使用移动应用程序。如果您查看您的服务器项目 packages.config,您可能会看到类似这样的内容。

 <package id="Microsoft.Azure.Mobile.Server" version="1.0.119.0" targetFramework="net45" />

我怀疑您得到的 400 是因为您使用的移动客户端版本低于 2.0.0。

在您的客户端项目包配置中,尝试使用更新的客户端版本,例如:

<package id="Microsoft.Azure.Mobile.Client" version="2.0.1" targetFramework="win81" />

您还应该检查 400 响应的正文以获取明确的错误消息。我希望它会说:

{"message":"No API version was specified in the request, this request needs to specify a ZUMO-API-VERSION of '2.0.0'.  For more information and supported clients see: http://go.microsoft.com/fwlink/?LinkId=690568#2.0.0"}

【讨论】:

  • 这实际上是问题所在。随着 azure 推出他们的新应用服务,许多 nuget 包变得有点混乱。仍然有 WindowsAzure.MobileServices 与 Microsoft.Azure.Mobile.Client 一起浮动很长一段时间。从移动服务到应用服务的迁移似乎仍然对我的 API 感到困惑
【解决方案3】:

我已经浏览了下面的链接

https://docs.microsoft.com/en-us/azure/app-service-mobile/app-service-mobile-client-and-server-versioning

这实际上是说移动应用程序客户端和服务器 SDK 最初都基于移动服务中的那些,但它们彼此不兼容。也就是说,您必须将移动应用程序客户端 SDK 与移动应用程序服务器 SDK 一起使用,并且对于移动服务也是如此。此合约通过客户端和服务器 SDK 使用的特殊标头值 ZUMO-API-VERSION 强制执行。

所以,你必须在请求中添加Headers

标题:ZUMO-API-VERSION:2.0.0

或者

http://localhost/api/values/get?ZUMO-API-VERSION=2.0.0

或者

您可以通过将应用设置 MS_SkipVersionCheck 的值设置为 true 来选择退出版本检查,请在您的 web.config 下的

中指定此项

【讨论】:

    【解决方案4】:

    实际上,即使您在 package.config 中指定了您使用的客户端版本,您仍然会收到相同的错误请求错误。未指定 Zumo 版本。您必须将指定版本的参数传递给您的 InvokeApiAsync 方法。例如:

    var arguments = new Dictionary<string, string>
                {
                    {"ZUMO-API-VERSION", "2.0.0" }
                };
    var result = MobileService.InvokeApiAsync<string>("CONTROLLERSNAME",  "HttpMethod.Get", arguements).Result;
    

    宾果游戏会起作用的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多