繁体   English   中英

在没有客户端或代理的情况下调用WCF服务

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM