5

Web API を既存の ASP.NET MVC プロジェクトに追加しようとしています。これは、元は ASP.NET MVC 2 Web サイトで、後で MVC 3 にアップグレードされ、次の手順を使用して MVC 4 に再度アップグレードされました。

ASP.NET MVC 2 プロジェクトを ASP.NET MVC 3 にアップグレードする

ASP.NET MVC 3 プロジェクトを ASP.NET MVC 4 にアップグレードする

私の Api コントローラーは非常に単純です。実際、これはデフォルトのテンプレートです。

public class ValuesController : ApiController
{
    // GET api/values
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }

    // GET api/values/5
    public string Get(int id)
    {
        return "value";
    }
}

API ルートを登録するためのクラスを追加しました。

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

それは Application_Start から呼び出されます

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    WebApiConfig.Register(GlobalConfiguration.Configuration);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
}

ただし、「localhost:50315/api/values」にアクセスしようとすると、次のエラーが発生します。

<Error>
<Message>
    No HTTP resource was found that matches the request URI    'http://localhost:50315/api/values'.
</Message>
<MessageDetail>
    No type was found that matches the controller named 'values'.
</MessageDetail>
</Error>

ルーティング デバッガーによると、ルートは正しく機能しているようです。Web API ルートは、「現在の要求に一致する」最初のエントリです。

4

4 に答える 4

2

以下の手順を参照してください。正しい答えが得られない場合がありますが、問題をデバッグするための指示が得られます。これらのアクションを 1 つずつ実行できます。

  1. 以下を実行したことを確認してください。

    Install-Package Microsoft.AspNet.WebApi
    

これは、DLL が正しいことを確認するためのものです。

  1. もう 1 つの方法は、get の上にルートを追加することです。

    class ValuesController : ApiController
    { 
        [System.Web.Http.Route("api/values")]
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }
    
        public string Get(int id)
        {
            return "value";
        }
    }
    
  2. デバッグのために MvC ルートを無効にします。すなわち

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        GlobalConfiguration.Configure(WebApiConfig.Register);
    }
    
  3. GET動詞を有効にします。

参考として、私のプロジェクトから以下を紹介します。

 <httpProtocol>
      <customHeaders>

        <add name="Access-Control-Allow-Headers" value="*" />
        <add name="Access-Control-Allow-Methods" value="*" />
      </customHeaders>
    </httpProtocol>
    <validation validateIntegratedModeConfiguration="false" />
    <handlers>
      <remove name="WebDAV" />
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
于 2014-09-14T05:47:20.137 に答える
2

解決策は、コメントでの AardVark71 の提案のように、apicontroller クラスに別の名前空間を与えることでした。

既存の MVC には WebApplication.Controllers のような名前空間があり、Web API は同じ名前空間を使用していました。私がそれを変更したとき、すべてがうまくいきました。

完全な Web API コントローラーは次のようになります。

namespace WebApplication.Api.Controllers
{
    public class ValuesController : ApiController
    {
        // GET api/values
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }

        // GET api/values/5
        public string Get(int id)
        {
            return "value";
        }
    }
}
于 2015-05-15T02:16:17.280 に答える
0

asp.net Web APIによって同じエラーが発生しましたが、別の方法とその方法でその問題を解決しました。

最初の方法

コントローラー名を AclController から AuthorizeController に変更し、問題を解決しました。

2番目の方法

メソッドパラメータの型をstring、int、boolなどで使用すると、このメソッドが問題を解決する可能性があります。型はこのエラーを受け取り、string、int、boolなどを使用しないでください。型はクラスまたはインターフェイスなどのみを使用します。問題。

于 2017-03-16T13:24:46.290 に答える