[英]Calling a WCF service without client or proxy
我的服务合同如下:
[ServiceContract]
public interface IWebProxyService
{
[OperationContract]
string GetSomeData();
}
我也在合同上尝试过此属性。
[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, UriTemplate = "/GetFormsBaseUrl")]
是否可以在没有任何服务引用/合同的情况下从另一个应用程序调用它。
我已经尝试了以下的多种变体(来自调用应用程序):
public static void GetSomeData(string webServiceProxyURL)
{
WebRequest request = WebRequest.Create(webServiceProxyURL);
request.Method = "GET";
request.ContentType = "application/json";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream dataStream = response.GetResponseStream();
StreamReader reader = new StreamReader(dataStream);
string responseFromServer = reader.ReadToEnd();
Console.WriteLine("Response: \n" + responseFromServer);
}
我收到“远程服务器返回错误:(400)错误的请求”。 Web异常状态为“ System.Net.WebExceptionStatus.ProtocolError”,我做错了什么,如何从另一个应用程序调用WCF方法?
您将无法像在代码中那样执行操作并获得类似的响应。 “不良请求”只是WCF告诉您,您的请求不符合WCF的期望。 所有WCF调用都希望该消息采用SOAP格式,否则服务器将无法识别您的调用。 想象一下,如果您的服务合同有两种方法而不是只有一种,那么当您发送这样的请求时,WCF如何知道要调用哪个方法? 答案是,当您使用客户端代理(由工具生成或由您自己使用ChannelFactory创建)调用WCF时,请求被封装到SOAP消息中,该消息包含很多信息,以允许WCF标识您要调用的端点,要调用的方法以及您提供的参数。
如果您确实想避免使用客户端代理类(您没有说出原因,所以我认为您有一个不错的选择),那么从理论上讲,您可以自己构造SOAP消息,并嵌入到HTTP标头中,然后使用http Web请求。 但是,这显然不是我推荐的方法。
现在,如果您具有服务合同的权力,则可以考虑在Web服务中实现RESTful api,它将允许您使用普通的http URL(如“ http://yourserver.com/getdata ”)访问该服务。 在大多数情况下,在WCF中实现RESTful服务非常容易,您只需要在服务合同中添加一个属性即可! 将其更改为这样的内容(添加属性,仅此而已)
[ServiceContract]
public interface IWebProxyService
{
[OperationContract]
[WebGet(UriTemplate="getData")]
string GetSomeData();
}
然后将服务配置为使用webHttpBinding,如下所示:
<configuration>
<system.serviceModel>
<services>
<service name="...">
<endpoint binding="webHttpBinding" contract="..."
behaviorConfiguration="webHttp"/>
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior name="webHttp">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
<configuration>
然后,可以从客户端访问Web服务,而无需使用服务合同,而只需使用普通的WebRequest; 您需要在服务uri的末尾附加一个'/ getData',并且响应为xml格式。
RESTful api可以让您使用简单的url做更多的事情(例如提供参数或修改数据等)。 有关WCF RESTful API的教程,请参见this 。 或搜索MSDN。
编辑:您甚至不需要编写代码来验证静态api的工作原理,只需启动Web浏览器并查看服务器的响应即可,这非常适合测试。
以下不是答案,只是一个粗俗的评论。 我希望它保持足够长的时间,以便OP能够阅读它。
代码的一大问题是您没有正确处理IDisposable
对象。 这将导致资源泄漏。 请尝试以下操作:
public static void GetSomeData(string webServiceProxyURL)
{
var request = WebRequest.Create(webServiceProxyURL);
request.Method = "GET";
request.ContentType = "application/json";
string responseFromServer = "No response from server";
using (var response = (HttpWebResponse) request.GetResponse())
{
using (var dataStream = response.GetResponseStream())
{
if (dataStream != null)
{
using (var reader = new StreamReader(dataStream))
{
responseFromServer = reader.ReadToEnd();
}
}
}
}
Console.WriteLine("Response: \n" + responseFromServer);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.