1

WebAPI コントローラーで奇妙な問題が発生しています。

私の開発環境 (Win7、IIS 7.5) では、コントローラーのメソッドが呼び出され、期待どおりに結果が返されます。

私の統合環境 (WIN Server 2003、IIS 6.0) では、コードを開発ボックスから統合ボックスにコピーして配置しました。コントローラーのメソッドが呼び出され、次のエラーが返されます。

「メディア タイプが「text/html」のコンテンツからタイプ「EmailQueueResult」のオブジェクトを読み取るために使用できる MediaTypeFormatter はありません。

理解できないのは、開発環境ではなく統合環境でのみこのエラーが発生する理由です。

    public HttpResponseMessage Post([FromBody]EmailQueueMessage email)
    {
        EmailQueueResult result;

        if (email != null)
        {
            try
            {
                var emailQueueIdList = QueueEmails(email);

                QueueAttachments(email, emailQueueIdList);

                foreach(var emailQueueId in emailQueueIdList)
                {
                    UpdateEmailQueueDateQueued(emailQueueId, DateTime.Now);
                }

                result = new EmailQueueResult(0, "Email added to queue.", "", null);
            }
            catch (Exception e) {
                result = new EmailQueueResult(2, "Error occurred.", e.Message, null);
            }
        }
        else
        {
            result = new EmailQueueResult(1, "Email passed in was null.", "", null);
        }

        return ControllerContext.Request.CreateResponse(HttpStatusCode.OK, result, "application/json");
    }

WebApiConfig.cs:

namespace App_Start
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.Routes.MapHttpRoute(
                "ControllerWithBooleanParameter",
                "api/{controller}/{showSentEmails}",
                null,
                new { boolConstraint = new IsBoolean() }
            );
            config.Routes.MapHttpRoute(
                "ControllerWithIntegerParameter",
                "api/{controller}/{id}",
                null,
                new { id = @"^\d+$" }
            );
            config.Routes.MapHttpRoute(
                "Default",
                "api/{controller}/{id}",
                new { id = UrlParameter.Optional }
            );
        }
    }
}

Web.config:

<?xml version="1.0" encoding="utf-8"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->
<configuration>
    <appSettings>
        <add key="webpages:Version" value="2.0.0.0" />
        <add key="webpages:Enabled" value="false" />
        <add key="PreserveLoginUrl" value="true" />
        <add key="ClientValidationEnabled" value="true" />
        <add key="UnobtrusiveJavaScriptEnabled" value="true" />
    </appSettings>
    <system.net>
        <settings>
            <httpWebRequest useUnsafeHeaderParsing="true" />
        </settings>
        <mailSettings>
            <smtp from="address@email.com">
                <network host="smtp.server.com" port="25" />
            </smtp>
        </mailSettings>
    </system.net>
    <system.web>
        <compilation debug="true" targetFramework="4.0" />
        <authentication mode="None" />
        <pages>
            <namespaces>
                <add namespace="System.Web.Helpers" />
                <add namespace="System.Web.Mvc" />
                <add namespace="System.Web.Mvc.Ajax" />
                <add namespace="System.Web.Mvc.Html" />
                <add namespace="System.Web.Optimization" />
                <add namespace="System.Web.Routing" />
                <add namespace="System.Web.WebPages" />
            </namespaces>
        </pages>
    </system.web>
    <system.webServer>
        <validation validateIntegratedModeConfiguration="false" />
        <modules runAllManagedModulesForAllRequests="true" />
        <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>
    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
                <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
            </dependentAssembly>
            <dependentAssembly>
                <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
                <bindingRedirect oldVersion="1.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
            </dependentAssembly>
            <dependentAssembly>
                <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
                <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
            </dependentAssembly>
        </assemblyBinding>
    </runtime>
</configuration>

また、このメソッドが単純な EmailQueueResult を返すようにしてみましたが、同じ結果が得られました。

編集:ここに私が試したいくつかのテストとその結果があります:

  • 外部ツールを使用してローカル マシンの Web サービスに POST 要求を送信すると、期待どおりに動作します。
  • コードのローカル コピーを使用して Web サービスを呼び出すコードを実行すると、期待どおりに動作します。
  • 外部ツールを使用して統合マシン上の Web サービスに POST 要求を送信すると、期待どおりに機能します。
  • 統合マシンを使用して Web サービスを呼び出すコードを実行すると、上記のエラーが発生します。

POST を送信するコード行:

        EmailQueueResult result = PostToWebService<EmailQueueMessage, EmailQueueResult>(EmailQueueBaseAddress, "application/json", EmailQueueUrlToCall, emailQueueMessage);

実際に呼び出しを行う PostToWebService メソッド:

    protected returnType PostToWebService<dataType, returnType>(string baseAddress, string mediaType, string urlToCall, dataType data)
    {
        HttpClient client = new HttpClient();
        client.BaseAddress = new Uri(baseAddress);

        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(mediaType));

        MediaTypeFormatter jsonFormatter = new JsonMediaTypeFormatter();

        HttpContent content = new ObjectContent<dataType>(data, jsonFormatter);

        HttpResponseMessage response = client.PostAsync(urlToCall, content).Result;

        returnType result = response.Content.ReadAsAsync<returnType>().Result;

        return result;
    }

更新: 2008 サーバーに Web サイトと Web サービスをインストールしました。失敗する唯一の組み合わせは、2003 ボックスの Web サービスが 2003 ボックスの Web サイトから呼び出された場合 (2003 サイト -> 2003 サービス) のようです。他の 3 つの組み合わせ (2008 サイト -> 2008 サービス、2008 サイト -> 2003 サービス、2003 サイト -> 2008 サービス) はすべて正しく機能しているようです。

4

1 に答える 1

2

わかりました、これはコードとは何の関係もないことがわかりました。基本的に、2003 ボックスのホスト ファイルのローカル ループバック アドレス (127.0.0.1) を 2003 ボックスの実際の IP に変更する必要があり、すべてが期待どおりに機能するようになりました。図に行きます。

于 2013-05-09T17:51:00.633 に答える