未经授权的HTTP请求消耗简单的WCF服务

时间:2012-08-05 08:18:31

标签: wcf

我们正按照以下准则设置Restful WCF服务:
http://www.codeproject.com/Articles/255684/Create-and-Consume-RESTFul-Service-in-NET-Framewor

说明没错,我们已成功运行测试版并在浏览器中显示XML结果(在我们的案例中为Person条记录)。

我们遇到的一个问题是,除了在浏览器中显示XML之外,作者并没有太多考虑。

您认为一旦结果以XML形式传达给您,就可以很容易地敲响一个客户端,该客户端可以将该数据反序列化到您的Person类中。

实际上,并不那么容易。有很多关于绑定和端点的问题......不确定我们是否已经正确掌握了。无论如何,过了一会儿,发现了一个代码样本,其中有一半是有意义的,并将其打破了:

Dim persons As Persons
Using host As New WebServiceHost(GetType(MyTestService), New Uri("http://MyServer:8443/TestService/"))
    host.AddServiceEndpoint(GetType(IMyTestService), New BasicHttpBinding(), "")
    host.Open()

    Using cf As New ChannelFactory(Of IMyTestService)(New BasicHttpBinding(), "http://MyServer:8443/TestService/")
        cf.Endpoint.Behaviors.Add(New WebHttpBehavior())
        Dim channel As IMyTestService = cf.CreateChannel()


        persons = channel.GetPersons
    End Using

    MsgBox(persons.Count)

End Using

唯一的问题是它在行persons = channel.GetPersons上失败并出现此错误:

  

HTTP请求未经授权使用客户端身份验证方案   '匿名'。从服务器收到的身份验证标头是   '协商,NTLM'。

现在,当服务器非常乐意通过IE或Chrome提供数据时,我发现收到身份验证错误很奇怪。

然后我们尝试将WebHttpBinding更改为BasicHttpBinding,希望比预期更多,因为我们不确定这些方法在表面下实际做了什么,但会产生错误:

  

'http:// MyServer:8443 / TestService /'中的端点没有   使用None MessageVersion绑定。   'System.ServiceModel.Description.WebHttpBehavior'仅适用于   与WebHttpBinding或类似的绑定一起使用。

1 个答案:

答案 0 :(得分:1)

嗯...您正在展示的代码示例将是使用basicHttpBinding SOAP 绑定的WCF服务的服务器端与REST无关...它是绝对不是客户端到WCF REST服务的代码!

假设您的WCF REST服务已启动并运行,您的客户端将非常简单,如下所示:

// create a new web request to query your service
WebRequest request = WebRequest.Create("http://MyServer:8443/TestService/");

// get the response
WebResponse response = request.GetResponse();

// examine some properties of the response
long length = response.ContentLength;
string contentType = response.ContentType;

// fetch the XML (or JSON) contents of the response
string content = new StreamReader(response.GetResponseStream()).ReadToEnd();