-1

我是 wcf 服务的新手。还在读书以获取知识。我公司在我们城市有很多办事处,但只有一个总公司。我公司有一个静态IP。我公司计划在总部服务器上托管一个 wcf 服务,该服务可以通过 Internet 上的静态 IP 访问,其他办公室通过 VPN 相互连接。我们公司希望我开发一个 wcf 服务,用于在总部的所有 pc 以及其他办公室的所有 pc 之间处理公司数据。人们也可以在外面将能够连接到该 wcf 服务。

公司希望当任何人尝试从总部办公室连接到我们的服务时,HQ lan 将用于连接到该服务。

当任何人尝试从我们的其他办公室连接到我们的服务时,将使用 WAN 或 VPN 连接。

当任何人尝试从其他地方或家中连接到我们的服务时,将通过互联网进行连接。

我是 WCF 的新手,所以无法考虑如何使用 WCF 设计这种服务,该服务将托管在我们具有静态 IP 的总部服务器中。

所以指导我在编码或在我们指定各种绑定的配置文件中是否需要任何调整。

我想我们需要在服务配置文件中指定各种绑定。所以请指导我如何设计或编写服务端的配置文件,可以通过 LAN、VPN 和互联网请求。如果可能的话,给我一份服务端配置文件的样本副本。谢谢

4

4 回答 4

1

我们现在正在开展一个大型项目,我相信这与您正在从事的工作相似。我们有许多用户将从他们的桌面 PC 以及他们的移动设备访问这个应用程序。我设计了一个非常灵活的服务层,它根据用户是本地用户还是远程用户(注意 VPN = 本地)提供最佳性能。由于空间不足,我无法为您提供所有细节,但这里有一些重要的部分:

创建三个 Visual Studio 项目(或一个包含三个项目的解决方案):1) 您的应用程序,2) 服务项目 (.dll),3) WCF 项目。

您的服务项目就是行动所在。在您的服务项目中,创建一个名为 IMyServices 的接口(这是标准的 WCF 内容):

[ServiceContract]
public interface IMyServices : IDisposable
{
    [OperationContract]
    IEnumerable<Allocation> GetAllocations();
}

接下来,添加一个如下所示的类。我称它为 ServiceRouter 是因为如果用户是远程用户,它会将请求路由到 WCF ,但如果用户是本地用户,它只会使用 ADO over LAN 获取数据。请注意,此类实现 IMyServices。

public class ServiceRouter : IMyServices
{
    private readonly string ServiceURI;

    /// <summary>
    /// Routes data requests over the LAN if the client is connected locally or over a WCF service if the client is remote. Use this constructor to route data requests over the LAN.
    /// </summary>
    /// http://msdn.microsoft.com/en-us/library/ms735103.aspx
    /// 
    public ServiceRouter()
    {
        ServiceURI = null;
    }

    /// <summary>
    /// Routes data requests over the LAN if the client is connected locally or over a WCF service if the client is remote.
    /// </summary>
    /// <param name="serviceURI">Fully qualified URI of a WCF server if the user is remote.  Pass null if the user authenticated on the LAN (including using VPN)</param>
    /// http://msdn.microsoft.com/en-us/library/ms735103.aspx
    /// 
    public ServiceRouter(string serviceURI)
    {
        ServiceURI = serviceURI;
    }

    public IEnumerable<Allocation> GetAllocations()
    {
        IMyServices client = GetClient();
        var result = client.GetAllocations().ToList();
        CloseClient(client);
        return result;
    }

      #region WCFClient
    private IMyServices GetClient()
    {
        IMyServices _client;

        if (string.IsNullOrEmpty(ServiceURI))
            _client = new MYServices();
        else
        {
            _client = ChannelFactory<IMyServices>.CreateChannel(new BasicHttpBinding(), new EndpointAddress(ServiceURI));
            ((ICommunicationObject)_client).Open();
        }
        return _client;
    }

    private void CloseClient(IMyServices client)
    {
        ICommunicationObject wcfClient = client as ICommunicationObject;

        if (wcfClient != null)
        {
            if (wcfClient.State == CommunicationState.Faulted)
                wcfClient.Abort();
            else
                wcfClient.Close();
        }
        else
            ((IDisposable)client).Dispose();
    }
    #endregion
}

接下来,在您的服务项目中,为您的服务创建一个实现 IMyServices 的类,如下所示:

internal partial class MyServices : IMyServices
{
    public IEnumerable<Allocation> GetAllocations()
    {
        // access your db here
    }

下面介绍如何使用 WCF 公开服务。您将需要配置您的 web.config,并且您需要从您的服务项目中引用 .dll 文件。
在您的 WCF 项目中添加一个 WCF 服务,如下所示。请注意,该类继承自实现 IMyService 的 ServiceRouter。 下面的代码是 WCF 项目中唯一的代码! 这段代码所做的只是创建一个 ServiceRouter 的实例,向它传递一个空 uri,告诉它通过 LAN 获取数据。当然,您的 WCF 服务器和 DB 服务器需要能够通过 LAN 进行通信才能正常工作。

public class MyWCFService : MyServiceProject.ServiceRouter
{
    public MyWCFService() : base()
    { 
        // Since the WCF server is running on the local area network, this class only needs to create an instance of 
        // the service router in local mode and retrive the requested data.  WCF serializes the data and sends it
        // back over the wire.
    }
}

这是您的 web.config 外观的片段:

<service name="MyWCFService" behaviorConfiguration="xxx">
        <endpoint address="" binding="basicHttpBinding" bindingNamespace="http://blah.com" contract="MyServiceProject.IMyServices"> 

在您的应用项目中,添加对您的服务 .dll 文件的引用。查看您的用户的 IP 地址,如果它是本地的,请使用创建 ServiceRouter 的实例,将 null 传递给构造函数。如果用户是远程用户,请在创建服务路由器实例时传递 wcf 服务器的 URI:即 ServiceRouter router = new ServiceRouter(myServerName);

于 2013-06-18T15:05:46.807 回答
1

LAN vs WAN vs VPN 对于 WCF 来说,newtork 级别太低了。假设您使用 basicHttpBinding 并在 IIS 中托管您的 WCF 服务,该服务在具有静态 IP 的总部服务器中运行,您的互联网用户将能够使用外部 IP(静态 IP)或域名(如果有)来访问您的服务是一个。对于 Intranet(LAN、WAN 等),用户可以使用内部 IP,您可以通过从网络内 ping 服务器来获取该 IP。再次假设将使用 WCF 的计算机与运行 WCF 服务的计算机之间的路径不会跨越防火墙和其他东西,您可以使用 netTcp 绑定,如果您的组织有很多红色,它的性能可能会稍高一些,但不值得麻烦如果两者之间有防火墙,请用胶带打开端口和东西。一般80和443是不会被屏蔽的。

于 2013-06-18T14:05:09.183 回答
0

这是一个简单的网络配置问题。您的服务有一个或多个端点。如此简单地将来自各种网络的请求路由到那个/他们。

于 2013-06-18T13:59:56.443 回答
0

您的问题有点“tl; dr”和开放式,但我可以建议您学习 WCF 端点的“ABC”:地址、绑定、合同吗?如果您想对单个服务端点同时使用 HTTP 和 TCP,可以将两种绑定类型配置到同一个端点。

来自文章:

需要注意的是,这三个元素是独立的。一个合约可以支持多个绑定,一个绑定可以支持多个合约。一个服务可以有多个端点(合约绑定到地址)共存并同时可用。因此,如果您想通过 HTTP 公开您的服务并使用 SOAP 1.1 以获得最大的互操作性,并且还希望使用二进制线路编码通过 TCP 公开它以获得最大的性能,那么两个生成的端点可以并排驻留在非常相同的服务。

于 2013-06-18T14:04:39.547 回答