WebChannelFactory调用使用WebInvoke Method = GET配置的WCF方法抛出ProtocolException

时间:2015-04-07 21:45:34

标签: c# .net wcf

我在调用标有WebInvoke Method ='GET'的WCF方法时遇到问题。 这是我的代码:

WCF主持人:

            var baseUri = new Uri("http://localhost:8099/hello");

        // Create the ServiceHost.
        using (var serviceHost = new ServiceHost(typeof(HelloWorldService), baseUri))
        {
            var serviceEndpoint = serviceHost.AddServiceEndpoint(typeof(IHelloWorldService), new WebHttpBinding(), "");
            serviceEndpoint.Behaviors.Add(new WebHttpBehavior());
            serviceEndpoint.Name = "WebHttpBinding_IHelloWorldService";
            serviceEndpoint.Contract.ConfigurationName = "HelloWorldService.IHelloWorldService";

            serviceHost.Description.Behaviors.Add(new ServiceMetadataBehavior{HttpGetEnabled = true});
            serviceHost.Open();

            //Keeps it open
            Console.WriteLine("The service is ready at {0}", baseUri);
            Console.WriteLine("Press <Enter> to stop the service.");
            Console.ReadLine();

            serviceHost.Close();
        }

服务合同:

    [ServiceContract]
public interface IHelloWorldService
{
    [OperationContract]
    //[WebGet(UriTemplate = "/SayHello")]
    [WebInvoke(UriTemplate = "/SayHello", Method = "GET")]
    string SayHello();

    [OperationContract]
    [WebInvoke(UriTemplate = "/SayHelloTwo", Method = "POST")]
    string SayHelloTwo(string name);
}

public class HelloWorldService : IHelloWorldService
{
    public string SayHello()
    {
        return string.Format("Hello, Whatever");
    }

    public string SayHelloTwo(string name)
    {
        return string.Format("Hello, {0}", name);
    }
}

以下是我如何调用方法:

            WebChannelFactory<IHelloWorldService> factory = new WebChannelFactory<IHelloWorldService>(new Uri("http://localhost:8099/hello"));
        var channel = factory.CreateChannel();
        var sayHelloTwo = channel.SayHelloTwo("Claor");
        Console.WriteLine(sayHelloTwo);

        var sayHello = channel.SayHello();
        Console.WriteLine(sayHello);

我的问题是当我调用channel.SayHello();它抛出这样的异常: mscorlib.dll中出现未处理的“System.ServiceModel.ProtocolException”类型异常

其他信息:远程服务器返回了意外响应:(405)方法不允许。

它发生在[WebInvoke(UriTemplate =“/ SayHello”,Method =“GET”)]和[WebGet(UriTemplate =“/ SayHello”)]上。 但是,如果我使用[WebInvoke(UriTemplate =“/ SayHello”,Method =“POST”)],它可以正常工作,如下面的方法所示。 问题是我真的需要这个方法成为GET方法,因为偶尔我需要通过浏览器调用它。

我开始相信WebChannelFactory简单不适用于GET方法。是吗?或者我做错了什么?

感谢您的时间。

0 个答案:

没有答案