Asp.net Webフォームアプリケーションをv4.0統合モードで実行しています。
App_Codeフォルダーにapicontrollerを追加しようとしました。
Global.asaxで、次のコードを追加しました
RouteTable.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = System.Web.Http.RouteParameter.Optional }
);
http://localhost/api/Value
のコントローラーに移動しようとすると、404エラーが表示されます。
拡張子のないURLはハンドラーセクションで構成されます。 Webサイトでフォームと匿名認証を有効にしています。
ExtensionLess URLは「*」用に構成されています。
コントローラのURLにアクセスすると、リクエストはExtensionlessUrlHandler-Integrated-4.0ではなくStaticHandlerによって処理されます。
下の図に示すように、システムがエラーをスローする理由は今のところわかりません。
この問題が発生していました。
WebApiConfig.cs
を編集して、ここでのいくつかの推奨事項と他の場所でのコードサンプルを満たしてみました。一部は機能しましたが、WebApiConfig.cs
がMSテンプレートWebApiプロジェクトに従って正確にコーディングされたときにルートが機能しなかった理由を説明しませんでした。
私の実際の問題は、WebApi
をプロジェクトに手動で追加する際に、Global.asax
からの構成呼び出しの在庫順に従わなかったことです。
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
// This is where it "should" be
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
// The WebApi routes cannot be initialized here.
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
これがなぜなのか推測することはできましたが、それ以上調査しませんでした。控えめに言っても直観的ではありませんでした。
問題はルーティング構成にあります。 Mvc
ルーティングは、WebApi
ルーティングとは異なります。
System.Web.Http.dll
、System.Web.Http.Webhost.dll
、およびSystem.Net.Http.dll
への参照を追加し、次のようにAPIルーティングを構成します。
GlobalConfiguration.Configuration.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = System.Web.Http.RouteParameter.Optional }
);
次のことを確認してください
1.)Web APIがIISに4.5インストール4.5の場合、IISが.NET 4.5または4.0で構成されていることを確認します
管理者権限でコマンドプロンプトでこのコマンドを実行します
C:\Windows\Microsoft.NET\Framework\v4.0.30319>aspnet_regiis.exe -i
2.)ルーティングを変更します
RouteTable.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "{controller}/{id}",
defaults: new { id = System.Web.Http.RouteParameter.Optional }
);
demo/Getでリクエストを行います(デモはコントローラー名です)
1,2が機能しない場合は3を試してください
3.)web.configファイルに次の構成を追加します
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
</system.webServer>
また、コントローラーが「PizzaPieController」のように「Controller」という名前で終わっていることを確認してください。
上記のすべてを試してみましたが、同じ問題がありました。 IISで作成されたアプリケーションプールは、デフォルトで.net 2.0になっていることが判明しました。 4.0に変更すると、再び機能しました
ありがとうシャノン、素晴らしい作品=>
Global.asaxでの注文は次のとおりです。
GlobalConfiguration.Configure(WebApiConfig.Register);
RouteConfig.RegisterRoutes(RouteTable.Routes);
良いものの代わりに:
RouteConfig.RegisterRoutes(RouteTable.Routes);
GlobalConfiguration.Configure(WebApiConfig.Register);
また、api binフォルダーのコンテンツ全体を削除してみてください。私は古いdllを含んでおり(名前空間の名前を変更したため)、競合するコントローラーを公開していました。これらのdllは、Visual Studioのクリーン機能によって削除されませんでした。
(ただし、asp.net web apiには、デバッグレベルでのルーティングおよびデバッグ情報が深刻に欠けていることがわかります)。
App_Codeでコントローラーを作成する場合、ルーティングテーブルはそれがどこにあるかをどのように知るのですか?ルートを「api/{controller/...」として指定しましたが、コントローラーのある場所ではありません。正しいフォルダーに移動してみてください。
これに何時間も費やした後、私の場合、これに対する解決策を見つけました。
RouteConfigでルートを登録する順序でした。
Defaultコントローラールートの前に、ルートテーブルにHttpRouteを登録する必要があります。次のようになります。 ルート構成ルートテーブル構成
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
試行しているURL(http://localhost/api/Value
)については、ValueController
から派生し、次の特性を持つパブリックメソッドを持つApiController
という名前のパブリックタイプがあることを確認してください。
Get
で始まります(例:GetValues
または単にGet
)。HttpGet
属性があります。デフォルトのWeb APIプロジェクトテンプレートからコードを試行する場合、コントローラーの名前はValuesController
ではなくValueController
であるため、URLはhttp://localhost/api/values
になります。
上記のいずれにも当てはまらない場合は、 トレースを有効にする を使用すると、パイプラインのどこでエラーが発生したか(およびその理由)を知ることができます。
お役に立てれば。
RouteAttribute
ベースのコントローラーdllをbinフォルダーにコピーしましたが、有効なコントローラーとして認識されず、クライアントで404エラーが発生していました。
多くのデバッグを行った後、問題が見つかりました。これは、コントローラーが参照しているSystem.Web.Http.dll
のバージョンが、メインプロジェクト(global.asax.csを含むプロジェクト)が参照しているSystem.Web.Http.dll
のバージョンと異なるためです。
Asp.Netは、このようなコードを使用してリフレクションによってコントローラーを見つけます
internal static bool IsControllerType(Type t)
{
return
t != null &&
t.IsClass &&
t.IsVisible &&
!t.IsAbstract &&
typeof(IHttpController).IsAssignableFrom(t) &&
HasValidControllerName(t);
}
IHttpController
はSystem.Web.Http.dll
のバージョンごとに異なるため、コントローラーとメインプロジェクトは同じ参照を持つ必要があります。
これもありました。NETバージョンを4.5から4.5.1以降に変更すると問題が解決しました
次のように、コントローラー名のValue
部分のみを使用してみてください。
http://localhost/api/Value
注:慣例により、ルーティングエンジンはコントローラー名として渡された値を取得し、それにWord
Controller
を追加します。 URIにValueController
を入れることで、ルーティングエンジンにValueControllerController
という名前のクラスを検索させましたが、見つかりませんでした。
次のリストに馬鹿げた見落としを追加する時間です。webapiのデフォルトルートパスを誤って入力しました。
元の:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/id",
defaults: new { id = RouteParameter.Optional}
);
修正:(「id」の周りの中括弧に注意してください)
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional}
);
ルートの構成は良好です。 web.configのハンドラーセクションを再確認してください。統合モードでは、ExtensionLessUrlHandlerを使用する適切な方法です。
<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" />
私の場合、ApiControllerから派生させるのを忘れていました。
それは次のようになります
public class ValuesController : ApiController
上記の解決策のいずれも私の問題を解決しませんでした...私のエラーは、binファイルを実動サーバーに直接コピーしたことで、その後は動作しませんでした。プロジェクトをディスクに発行し、「発行済み」フォルダーをサーバーにコピーすると、404はなくなりました。それは少し明白ですが、いくつかを助けることができます。
これは非常に古い質問であることに感謝しますが、将来のユーザーのために別の答えを追加すると思いました。
これは、CI/Stagingに展開された後にのみ作業していたプロジェクトで今起こっていることがわかりました。解決策は、各バージョンを各環境に1回ずつデプロイしながら、コンパイルdebug = "true"値を前後に切り替えることでした。