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 未处理,HResult=-2146233087,Message=Internal Server Error”

我无法在服务器端进行调试,因为 Visual Studio 2012 显示“无法自动调试 'MyProject'。无法调试远程过程。这通常表明服务器上尚未启用调试。”

但是,调试已启用。在启用诊断的情况下使用 SvcTraceViewer 我无法获得任何见解。

我的主要兴趣是找出使用 WebHttpBinding 的 REST 调用失败的原因,但帮助让服务器端调试工作也将不胜感激。我正在使用多个启动项目在 VS2012 中调试客户端和服务器。本地主机是唯一涉及的服务器。

我知道 REST 端点不会出现在 WcfTestClient 中,因为它不提供元数据交换,但我希望能够通过该端点调用服务,并且我发现我的代码和调用 RESTful WCF 服务的示例之间没有区别。

4

1 回答 1

0

要访问 REST 端点,请尝试使用浏览器或 HttpClient 向 URL 发出 HTTP POST 请求:$http://localhost:50001/Service1.svc/webHttp/GetData$。当您像在代码中那样使用 webHttpClient 来调用服务时,您正在发送一个 REST 端点无法处理的 SOAP 请求。我相信这就是您的其他两个端点工作正常但不是这个端点的原因。

于 2012-10-11T23:00:02.720 回答