9

このチュートリアルのサンプル コードを使用して作成した非常に基本的な 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 Astxt

期待される結果

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期待どおりにファイルをダウンロードするようになりました。

4

2 に答える 2

2

Fiddler またはブラウザーの開発ツールを使用して生の要求と応答を確認すると、問題に関するいくつかの手がかりが見つかるはずです。

于 2013-08-08T18:44:47.597 に答える
2

応答タイプ (xml、json など) は、要求の accept ヘッダーによって決定されます。サービスを呼び出すために使用していたブラウザーについては言及していませんが、ブラウザー間でデフォルトの受け入れヘッダーに違いがあると思います。webapi から Json データのみを返したい場合は、次を Global.Asax に追加してみてください。

    GlobalConfiguration.Configuration.Formatters.Clear();

    GlobalConfiguration.Configuration.Formatters.Insert(0,new JsonMediaTypeFormatter());

メディア フォーマッターは基本的に、Webapi メソッドからのデータをブラウザー用にシリアル化する方法です。

于 2013-08-08T16:27:56.120 に答える