我们正按照以下准则设置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或类似的绑定一起使用。
答案 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();