代码之家  ›  专栏  ›  技术社区  ›  Pier Giorgio Misley

c#web api无法从web调用

  •  1
  • Pier Giorgio Misley  · 技术社区  · 8 年前

    web api 解决方案 模型 .

    这是我的一个例子 模型 :

    public class Category
    {
        [Key]
        public int Id { get; set; }
        [Required]
        public string Name { get; set; }
    }
    

    这是他的 控制器 :

    public class CategoriesController : ApiController
    {
        private FrigoWebServiceContext db = new FrigoWebServiceContext();
    
        // GET: api/Categories
        [HttpGet]
        public string GetCategories()
        {
            return JsonConvert.SerializeObject(db.Categories.ToList());
        }
    
        // GET: api/Categories/5
        [ResponseType(typeof(string))]
        public string GetCategory(int id)
        {
            Category category = db.Categories.Find(id);
            if (category == null)
            {
                return null;
            }
    
            string jsonCategory = JsonConvert.SerializeObject(category);
            return jsonCategory;
        }
    
        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
        }
    
        private bool CategoryExists(int id)
        {
            return db.Categories.Count(e => e.Id == id) > 0;
        }
    }
    

    现在,这是 配置 :

            config.Routes.MapHttpRoute(
                name: "GetId",
                routeTemplate: "api/{controller}/{id}"
                //defaults: new { id = RouteParameter.Optional }
            );
            config.Routes.MapHttpRoute(
                name: "GetAll",
                routeTemplate: "api/{controller}"
                //defaults: new { id = RouteParameter.Optional }
            );
    

    但是打电话给以下网站,我什么都没有得到

    注意:我使用IIS发布了带有“的api” myAppName “路径名

    但没有一个是有效的

    这是 错误 :

    错误HTTP 404.0-未找到所需资源已被删除,

    我在互联网上看到了一些问题,我试图使用它们,但我不明白为什么这不起作用。

    任何帮助都将不胜感激,这是我第一次使用WebApi

    这是我的 Web.Config

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <configSections>
        <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
      </configSections>
      <connectionStrings>
        <add name="FrigoWebServiceContext" connectionString= [***] />
      </connectionStrings>
      <appSettings></appSettings>
      <system.web>
        <compilation debug="true" targetFramework="4.5" />
        <httpRuntime targetFramework="4.5" />
        <httpModules>
          <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" />
        </httpModules>
      </system.web>
      <system.webServer>
        <handlers>
          <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
          <remove name="OPTIONSVerbHandler" />
          <remove name="TRACEVerbHandler" />
          <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
        </handlers>
        <validation validateIntegratedModeConfiguration="false" />
        <modules>
          <remove name="ApplicationInsightsWebTracking" />
          <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" preCondition="managedHandler" />
        </modules>
      </system.webServer>
      <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
          <dependentAssembly>
            <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="1.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
            <bindingRedirect oldVersion="0.0.0.0-9.0.0.0" newVersion="9.0.0.0" />
          </dependentAssembly>
        </assemblyBinding>
      </runtime>
      <system.codedom>
        <compilers>
          <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701" />
          <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
        </compilers>
      </system.codedom>
      <entityFramework>
        <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
        <providers>
          <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
        </providers>
      </entityFramework>
    </configuration>
    
    1 回复  |  直到 8 年前
        1
  •  3
  •   Community T.Woody    7 年前

    如果您不使用 Route attribute 若要指定/覆盖方法名称,并且您没有在路由中指定默认方法名称,则Web API将使用默认动作谓词 Get , Post , Put , Delete 作为方法名称。这意味着您必须更改方法,如下所示:

    只查看方法名称的更改,不要注意返回类型,这是我对示例代码的另一个不满。您应该让Web API框架使用配置的序列化程序,而不是返回字符串,而是返回 IHttpActionResult 默认情况下。“为什么”和“如何”超出了这个问题的范围,但我不会在方法签名上留下字符串作为返回类型,从而使错误的做法永久化。

    public class CategoriesController : ApiController
    {
      [HttpGet]
      public IHttpActionResult Get()
    
      // or to pass in an an int and return only 1 category
      [HttpGet]
      public IHttpActionResult Get(int id)
    

    现在允许您像这样调用api

    • /Api/Categories/
    • /Api/Categories/128 用第二种方法

    如果要使用除4(get/put/post/delete)之外的方法名,则可以在 WebApiConfig.cs 或使用 路由属性 .

    对于WebApiConfig。cs only change您可以这样做:

    config.Routes.MapHttpRoute(
        name: "Get",
        routeTemplate: "api/{controller}/{action}/{id}"
        defaults: new { id = RouteParameter.Optional }
    );
    

    现在允许您像这样调用api

    • /Api/Categories/GetCategories/
    • /Api/Categories/GetCategory/1234

    如果您想使用 路由属性 你可以这样做:

    [RoutePrefix("api/categories"]
    public class CategoriesController : ApiController
    {
      [HttpGet]
      [Route("")]
      public IHttpActionResult GetCategories()
    
      [HttpGet]
      [Route("{id:int}")]
      public IHttpActionResult GetCategory(int id)
    

    现在允许您像这样调用api

    • /Api/类别/
    • /Api/类别/128 用第二种方法

    编辑

    根据下面的评论。。。 另请参见 HTTP 404 Page Not Found in Web Api hosted in IIS 7.5 .加入 UrlRoutingModule web.config 修复了该问题,因为它是由该和路由配置引起的。。