部署到 Azure 网站时 WebApi 不工作

Posted

技术标签:

【中文标题】部署到 Azure 网站时 WebApi 不工作【英文标题】:WebApi Not Working When Deployed to Azure Website 【发布时间】:2013-10-20 16:36:34 【问题描述】:

我的 WebApi 在我的本地机器上完美运行,但是当发布到 Azure(天蓝色网站)时,我得到以下信息:

未找到与请求 URI 匹配的 HTTP 资源 'http://myazurewebsite.domain/Api/Zipcode/GetLatLong?zip5=23423'。

但在本地主机上它工作得很好。

http://localhost/Api/Zipcode/GetLatLong?zip5=20024

"Latitude":38.89,"Longitude":-77.03

我有一个修改过的 WebApi 路由:

 public static class WebApiConfig

    public static void Register(HttpConfiguration config)
    
        config.Routes.MapHttpRoute(
            name: "DefaultPublicApi",
            routeTemplate: "Api/controller/action/id/format",
            defaults: new  id = RouteParameter.Optional, format = RouteParameter.Optional
        );
    

ApiController 类:

using System.Net;
using System.Net.Http;
using System.Web.Http;
using Project.Geography.Services;
using Project.WebPublic.Filters;

namespace Project.WebPublic.Controllers.WebApi

    public class ZipCodeController : ApiController
    
        private readonly ZipCodeService _zipCodeService;

        public ZipCodeController(ZipCodeService zipCodeService)
        
            _zipCodeService = zipCodeService;
        


        [HttpGet]
        [TransactionFilter]
        public HttpResponseMessage GetLatLong(string zip5)
        
            if (zip5.Length != 5)
                return Request.CreateResponse(HttpStatusCode.BadRequest, "Zip Code Length Not Equal to 5");

            var zip = _zipCodeService.GetByZip5(zip5);

            if (zip == null)
                return Request.CreateResponse(HttpStatusCode.NotFound, "Could not find Zip Code in Database");

            var latlong = new
            
                Latitude = zip.Latitude,
                Longitude = zip.Longitude
            ;

            return Request.CreateResponse(HttpStatusCode.OK, latlong);
        
    


【问题讨论】:

部署为云服务时也能正常工作,但部署为网站时效果不佳。 从来没有想到这一点。开始了一个新项目,效果很好。 我想我会添加评论,因为我今天遇到了完全相同的问题。我终于找到了一个原因/解决方案:我最初创建了一个云服务项目,然后将 Web 角色(技术术语)从它中取出,以部署为一个独立的网站(更适合我的需要),但是在复制了 Web 角色之后对于一个单独的项目,我一直忽略的名为“WebRole.cs”的原始项目还剩下一个文件。其中的代码阻止了 WebApi 的启动。一旦我删除它并重新部署它就开始正常工作......这也是你的问题吗? 这实际上为我修复了它。非常感谢! 【参考方案1】:

尝试如下添加路由

    [HttpGet]
    [TransactionFilter]
    [Route("api/GetLatLong")]
    public HttpResponseMessage GetLatLong(string zip5)
    
        if (zip5.Length != 5)
            return Request.CreateResponse(HttpStatusCode.BadRequest, "Zip Code Length Not Equal to 5");

        var zip = _zipCodeService.GetByZip5(zip5);

        if (zip == null)
            return Request.CreateResponse(HttpStatusCode.NotFound, "Could not find Zip Code in Database");

        var latlong = new
        
            Latitude = zip.Latitude,
            Longitude = zip.Longitude
        ;

        return Request.CreateResponse(HttpStatusCode.OK, latlong);
    

然后你的路线配置如下

public static class WebApiConfig

    /// <summary>
    /// Register the http configuration for web API.
    /// </summary>
    /// <param name="config">The http configuration instances</param>
    public static void Register(HttpConfiguration config)
    
        config.MapHttpAttributeRoutes();
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/controller/id",
            defaults: new  id = RouteParameter.Optional );


    

【讨论】:

以上是关于部署到 Azure 网站时 WebApi 不工作的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows Azure 的何处部署 WebApi:作为网站还是作为云服务?

为 Service Fabric 配置 Azure 部署

将 WebAPI 和 MVC 项目发布到同一个 Azure 网站?

如何调用部署在 azure 上的 WEB api 服务结构?

在 Azure 中托管 WebApi 的推荐方式

Azure 发布管道 IIS 部署