这是WCF服务应用程序的有效使用

时间:2012-10-01 21:04:10

标签: c# visual-studio-2010 wcf

我有以下情况:

  • 方框P(最多可能需要30分钟才能完成)在方框X上。
  • 框Y上的WinForms应用程序 - 这将收集P。
  • 的输入条件
  • 因为P花了这么长时间,所以我希望它总是在X盒而不是Y上运行。

我被建议尝试在X上使用WCF服务应用程序。通过服务合同从Y向X发送消息,然后启动程序P.

这是WCF Service App项目的有效用途吗?


我遵循了这两个步骤:

  1. Create a WCF service
  2. Create a console app to consume WCF service
  3. 我现在有两个似乎互相交谈的项目。我可以从控制台应用程序运行以下代码,WCF项目中的方法moveData使用基于参数的一些信息成功更新数据库:

            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>
    

3 个答案:

答案 0 :(得分:1)

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

这里有MSDN articleCode Project tutorial,可以帮助您入门。

本质:

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服务公开数据,客户端(控制台应用程序)可以使用该服务。

答案 1 :(得分: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>

源代码您可以下载此示例以自行尝试..按照相同的步骤使您的服务也能正常运行 这顺便使用SSL WCF Transport Layer Security using wsHttpBinding and SSL

答案 2 :(得分:0)

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