2

我有以下情况:

  • 方框 X 上的程序 P(最多可能需要 30 分钟才能完成)。
  • 框 Y 上的 WinForms 应用程序 - 这会收集 P 的输入标准。
  • 因为 P 需要很长时间,我希望它始终在框 X 而不是 Y 上运行。

有人建议我尝试在 X 上使用 WCF 服务应用程序。通过服务合同从 Y 向 X 发送消息,然后这将触发程序 P。

这是对 WCF 服务应用程序项目的有效使用吗?


我遵循了这两个演练:

  1. 创建 WCF 服务
  2. 创建控制台应用以使用 WCF 服务

我现在有两个似乎可以互相交谈的项目。我可以从控制台应用程序运行以下代码,moveDataWCF 项目中的方法成功地使用基于参数的一些信息更新数据库:

        static void Main(string[] args) {
                Service1Client sc = new Service1Client();
                sc.moveData(0,1);
                sc.Close();
        }

我对这种技术很陌生-请记住。以下问题:
它仅在我在 Visual Studio 中打开或运行 WCF 项目时才有效 - 这是否符合预期?换句话说,如果 WCF 没有运行,消费应用程序是否应该抛出错误?
即,如果我使用 WCF 项目关闭 Vis Studio 的实例,然后尝试运行正在使用的应用程序,我会收到错误System.ServiceModel.EndpointNotFoundException was unhandled There was no endpoint listening at...followed by address of service 消息 如何让框 X 使用此 WCF?需要在那个盒子上安装或部署什么?

消费者控制台应用程序中的 app.config 如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IService1" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                    useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <security mode="None">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="UserName" algorithmSuite="Default" />
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://....svc" binding="basicHttpBinding"
                bindingConfiguration="BasicHttpBinding_IService1" contract="IService1"
                name="BasicHttpBinding_IService1" />
        </client>
    </system.serviceModel>
</configuration>
4

3 回答 3

1

根据其他建议,Windows 服务易于构建和设置。您甚至可以将其设置为在服务器(BOX X)启动时自动启动

这是MSDN 文章代码项目教程,可帮助您入门。

本质上:

public class UserService1 : System.ServiceProcess.ServiceBase  
{

    public UserService1() 
    {
        this.ServiceName = "MyService2";
        this.CanStop = true;
        this.CanPauseAndContinue = true;
        this.AutoLog = true;
    }
    public static void Main()
    {
        System.ServiceProcess.ServiceBase.Run(new UserService1());
    }
    protected override void OnStart(string[] args)
    {
        // Insert code here to define processing.
    }
    protected override void OnStop()
    { 
        // Whatever is required to stop processing
    }
}

编辑

然后,您可以将您处理的数据保存在数据库或文件系统或任何地方,并通过 WCF 服务公开数据,然后您的客户端(控制台应用程序)可以使用该服务。

于 2012-10-01T21:27:52.287 回答
1

查看此代码以获取有关如何使用 WCF 创建此代码的示例以及指向 SRC 代码的链接

<system.serviceModel>
 <services>
   <service behaviorConfiguration="returnFaults" name="TestService.Service">
      <endpoint binding="wsHttpBinding" bindingConfiguration=
            "TransportSecurity" contract="TestService.IService"/>
      <endpoint address="mex" binding="mexHttpsBinding" 
            name="MetadataBinding" contract="IMetadataExchange"/>
  </service>
 </services>
 <behaviors>
   <serviceBehaviors>
    <behavior name="returnFaults">
     <serviceDebug includeExceptionDetailInFaults="true"/>
       <serviceMetadata httpsGetEnabled="true"/>
       <serviceTimeouts/>
   </behavior>
  </serviceBehaviors>
 </behaviors>
 <bindings>
    <wsHttpBinding>
       <binding name="TransportSecurity">
             <security mode="Transport">
              <transport clientCredentialType="None"/>
              </security>
        </binding>
      </wsHttpBinding>
 </bindings>
 <diagnostics>
  <messageLogging logEntireMessage="true" 
    maxMessagesToLog="300" logMessagesAtServiceLevel="true" 
    logMalformedMessages="true" logMessagesAtTransportLevel="true"/>
  </diagnostics>
 </system.serviceModel>

//Contract Description
[ServiceContract]
interface IService
{
  [OperationContract]
   string TestCall();
}

//Implementation
public class Service:IService
{
  public string TestCall()
  {
      return "You just called a WCF webservice On SSL
                    (Transport Layer Security)";
  }
}

//Tracing and message logging
<system.diagnostics>
  <sources>
      <source name="System.ServiceModel" 
    switchValue="Information,ActivityTracing" propagateActivity="true">
         <listeners>
           <add name="xml"/>
        </listeners>
      </source>
        <source name="System.ServiceModel.MessageLogging">
        <listeners>
            <add name="xml"/>
         </listeners>
         </source>
    </sources>
        <sharedListeners>
          <add initializeData="C:\Service.svclog" 
        type="System.Diagnostics.XmlWriterTraceListener" name="xml"/>
         </sharedListeners>
       <trace autoflush="true"/>
</system.diagnostics>

您可以下载此示例的源代码以自行尝试..按照相同的步骤使您的服务正常工作 这通过 使用 wsHttpBinding 和 SSL 的 WCF 传输层安全性的方式使用 SSL

于 2012-10-01T21:28:43.550 回答
0

我可能会创建一个 Windows 服务来监视数据库以获取处理内容的消息。然后,该服务可以始终在您的服务器上运行(我假设是框 X)。WCF 服务可以启动一个长时间运行的进程,但可能不应该托管它。当然,我假设由 Asp.Net 托管的 WCF 服务。您也可以构建一个托管 WCF 的 Windows 服务,这将消除该服务监视消息数据库的需要。

于 2012-10-01T21:07:54.393 回答