このチュートリアルのサンプル コードを使用して作成した非常に基本的な Web API の例があります。
コード
関連する Web.config セクション
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<handlers>
<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>
</system.webServer>
ルート構成
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
モデルを見る
public class Survey
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
}
ApiController
public class SurveysController : ApiController
{
public IEnumerable<Survey> All()
{
using (ITSurveyEntities model = new ITSurveyEntities())
{
return new List<Survey>(
from s in model.Surveys
select new Survey
{
Id = s.Id,
Name = s.Name,
Description = s.Description,
});
}
}
}
これITSurveyEntities
はデータベースから生成された ADO.NET Entity Data Model であり、現在は 1 つのテーブルしか含まれていませんSurvey
。
要するに、ここで何か特別なことをしようとしているわけではありません。
現在の結果
などを使用して API に移動しようとするとhttp://localhost:1681/api/surveys
、応答が返されますが、ファイルの名前surveys
は拡張子なしです。さらに、拡張子を付けようとすると、ダウンロードが失敗しますSave As
。txt
期待される結果
surveys.json
サンプル プロジェクトが で行うように、API はファイル名を返しproducts
、ブラウザはファイルを開くか保存するかを尋ねます。
私が試したこと
Web.config ファイルの比較
Web.config
私のプロジェクトと機能するチュートリアルのサンプルコードとの間でファイルを比較しました。
ルーティングの比較
私のプロジェクトと、動作するチュートリアルのコード例との間でルーティング構成を比較しました。
WebDav を除く
WebDav が原因である可能性があることが検索で示されたので、WebDav を除外しようとしました。これは、このブログの内容と一致するように Web.config を変更することで実現しました。
更新 1
さて、Joe Enos によるガイダンスの後、問題はビュー モデルにも名前が付けられSurvey
ているため、CLR 型と EDM 型の間のあいまいさに関するエラーがスローされていることがわかりました。
ビューモデルの名前を に変更することでこれを解決しSurveyViewModel
、 へのリクエストが をhttp://localhost:1681/api/surveys
返し、HTTP 200
期待どおりにファイルをダウンロードするようになりました。