1

以下に示す単純な WCF サービスがあります。

[ServiceContract]
public interface IService1
{
    [OperationContract]
    [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest)]
    string GetData(int value);
}

public class Service1 : IService1
{
    public string GetData(int value)
    {
        return string.Format("You entered: {0}", value);
    }
}

サーバーの Web.config ファイルは

<?xml version="1.0"?>
<configuration>
<appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
</appSettings>

<system.serviceModel>
    <behaviors>
        <endpointBehaviors>
            <behavior name="webHttpEndpointBehavior">
                <webHttp faultExceptionEnabled="true" />
            </behavior>
        </endpointBehaviors>
        <serviceBehaviors>
            <behavior name="serviceBehaviourDebug">
                <!-- To avoid disclosing metadata information, set the values below to false before deployment -->
                <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
                <!-- To receive exception details in faults for debugging purposes, set the value below to true.
                     Set to false before deployment to avoid disclosing exception information -->
                <serviceDebug includeExceptionDetailInFaults="true"/>
            </behavior>
        </serviceBehaviors>
    </behaviors>

    <services>
        <service name="Diws.Service1" behaviorConfiguration="serviceBehaviourDebug">
            <endpoint
                address="/basicHttp"
                binding="basicHttpBinding"
                contract="Diws.IService1"/>
            <endpoint
                address="/webHttp"
                binding="webHttpBinding"
                behaviorConfiguration="webHttpEndpointBehavior"
                contract="Diws.IService1"/>
            <endpoint
                address="/wsHttp"
                binding="wsHttpBinding"
                contract="Diws.IService1"/>
            <endpoint
                address="mex"
                binding="mexHttpBinding"
                contract="IMetadataExchange" />
        </service>
    </services>

    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
</system.serviceModel>

<system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5"/>
</system.web>

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <!--
    To browse web app root directory during debugging, set the value below to true.
    Set to false before deployment to avoid disclosing web app folder information.
    -->
    <directoryBrowse enabled="true"/>
</system.webServer>
</configuration>

クライアントは、App.config がこれであるコンソール アプリです。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>

<system.serviceModel>
    <behaviors>
        <endpointBehaviors>
            <behavior name="webHttpEndpointBehavior">
                <webHttp />
            </behavior>
        </endpointBehaviors>
    </behaviors>

    <bindings>
        <basicHttpBinding>
            <binding name="BasicHttpBinding_IService1" />
        </basicHttpBinding>
        <wsHttpBinding>
            <binding name="WsHttpBinding_IService1" />
        </wsHttpBinding>
        <webHttpBinding>
            <binding name="WebHttpBinding_IService1" />
        </webHttpBinding>
    </bindings>

    <client>
        <endpoint
            address="http://localhost:50001/Service1.svc/basicHttp"
            binding="basicHttpBinding"
            bindingConfiguration="BasicHttpBinding_IService1"
            contract="ServiceReference1.IService1"
            name="BasicHttpEndpoint_IService1" />
        <endpoint
            address="http://localhost:50001/Service1.svc/webHttp"
            behaviorConfiguration="webHttpEndpointBehavior"
            binding="webHttpBinding"
            bindingConfiguration="WebHttpBinding_IService1"
            contract="ServiceReference1.IService1"
            name="WebHttpEndpoint_IService1" />
        <endpoint
            address="http://localhost:50001/Service1.svc/wsHttp"
            binding="wsHttpBinding"
            bindingConfiguration="WsHttpBinding_IService1"
            contract="ServiceReference1.IService1"
            name="WsHttpEndpoint_IService1"/>
    </client>
</system.serviceModel>

<system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5"/>
</system.web>
</configuration>

そしてクライアントプログラムはこれです。

class Program
{
    static void Main(String[] args)
    {
        String response = "";

        Service1Client basicHttpClient = new Service1Client("BasicHttpEndpoint_IService1");
        response = basicHttpClient.GetData(10);
        basicHttpClient.Close();
        Console.WriteLine(response);

        ///* Some communication exception
        Service1Client webHttpClient = new Service1Client("WebHttpEndpoint_IService1");
        response = webHttpClient.GetData(20);
        webHttpClient.Close();
        Console.WriteLine(response);
        //*/

        Service1Client wsHttpClient = new Service1Client("WsHttpEndpoint_IService1");
        response = wsHttpClient.GetData(30);
        wsHttpClient.Close();
        Console.WriteLine(response);

        Console.WriteLine();
        Console.WriteLine("Done");
        Console.ReadLine();
    }
}

basicHttpClient と wsHttpClient は完全に機能します。ただし、webHttpClient は例外「System.ServiceModel.CommunicationException was unhandled, HResult=-2146233087, Message=Internal Server Error」をスローします。

Visual Studio 2012 で「'MyProject' を自動的にデバッグできません。リモート プロシージャをデバッグできませんでした。これは通常、サーバーでデバッグが有効になっていないことを示しています。」と表示されるため、サーバー側でデバッグできません。

ただし、デバッグは有効になっています。診断をオンにして SvcTraceViewer を使用しても、洞察を得ることができませんでした。

私の主な関心事は、WebHttpBinding を使用した REST 呼び出しが失敗する理由を理解することですが、サーバー側のデバッグを機能させるのにも役立ちます。複数のスタートアップ プロジェクトを使用して、VS2012 でクライアントとサーバーの両方をデバッグしています。関連するサーバーは localhost だけです。

メタデータ交換を提供しないため、REST エンドポイントが WcfTestClient に表示されないことは理解していますが、そのエンドポイントを介してサービスを呼び出すことができると予想しており、コードと RESTful WCF サービスの呼び出しの例に違いは見られません。

4

1 に答える 1

0

REST エンドポイントにアクセスするには、ブラウザーまたは HttpClient を使用して、次の URL に対して HTTP POST 要求を作成してみてください: $http://localhost:50001/Service1.svc/webHttp/GetData$。コードで行うように webHttpClient を使用してサービスを呼び出すと、REST エンドポイントが処理できない SOAP 要求が送信されます。それが、他の2つのエンドポイントが正常に機能する理由であると思いますが、これはそうではありません.

于 2012-10-11T23:00:02.720 に答える