从客户端使用WCF服务,而不使用WCF服务库项目/程序集引用

时间:2016-01-28 20:36:48

标签: c# .net wcf servicecontract

以下问题可能重复,但没有足够的信息可以回答我的问题。

Is possible to access WCF Service without adding Service Reference?

我已按照本指南使用Visual Studio中的WCF服务库项目设置了TCP服务。

https://msdn.microsoft.com/en-us/library/ff649818.aspx

如果您从客户端(Windows窗体项目)添加对WCF服务库项目的引用,这非常有用。并将一个using语句添加到项目程序集中并使用此代码。

        TcpService.Service myService = new TcpService.Service();
        myService.GetData(123);
  

但是,我不想在其中添加对TcpService程序集的引用   调用方法“GetData”的项目。每一个   上面的问题答案。

所以我尝试使用这段代码。我添加了对System.ServiceModel(和using指令)的引用来解决大多数错误。但现在它说“找不到类型或命名空间名称'ServiceContract'(你是否缺少using指令或程序集引用?)”。我是否需要在我的服务中修改App.Config,或者将任何其他代码(关于'ServiceContract')添加到调用此代码的项目中?

        BasicHttpBinding binding = new BasicHttpBinding();
        EndpointAddress address = new EndpointAddress("net.tcp://localhost:8523/Service");
        ChannelFactory<ServiceContract> factory = new ChannelFactory<ServiceContract>(binding, address);
        ServiceContract channel = factory.CreateChannel();
        channel.GetData(123);

enter image description here

注意:我将默认的Service1.cs和默认接口IService1.cs重命名为Service.cs和IService.cs。没有“1”作为后缀,基于说明。我还在我的代码中将WcfServiceLibrary1重命名为TcpService。此外,在.NET 4.5中,我根本不需要这行代码才能工作。这个.Close()出错了。

myService.Close();

我在Visual Studio中添加了一个服务引用,右键单击了Project&gt;添加&gt;服务参考。但我在那里得到了一个错误。

enter image description here

第二个对话框出错:

  

无法识别URI前缀。元数据包含一个引用   无法解决:'net.tcp:// localhost:8523 / Service'。不能   连接到net.tcp:// localhost:8523 / Service。连接尝试   持续时间为00:00:01.0011001。 TCP错误代码10061:否   可以建立连接,因为目标机器主动拒绝   它127.0.0.1:8523。由于目标,无法建立连接   机器主动拒绝它127.0.0.1:8523如果服务已定义   在当前的解决方案中,尝试构建解决方案并添加   服务参考。

1 个答案:

答案 0 :(得分:1)

指南错过了一步。除了httpsGetEnabled属性之外,我还将httpGetEnabled设置为“false”,并且它有效!之后,我在添加服务引用时不再收到错误。然后我将'ServiceContract'更改为'MyClientProject.ServiceReference1.IService'以引用新的服务引用。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

...

    <behaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="false" httpsGetEnabled="false" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

</configuration>