如何调用IsOneWay WCF服务并正确关闭客户端

时间:2012-11-13 23:50:08

标签: asp.net wcf isoneway

我对WCF很新,我已经设置了一个测试网站和服务。我正在尝试两个完成两件事:

  1. 在不阻止用户的情况下调用服务
  2. 正确关闭客户端
  3. 我创建了一个web服务并为其提供了isoneway属性。我设法在不阻止用户的情况下调用它,但我担心我没有关闭客户端。如何在不阻止用户的情况下调用此服务并仍然正常关闭客户端?我应该使用异步方法(TestServiceAsync)吗?我应该使用BeginXX,EndXX方法吗?

    客户端:

    Dim callservice As New WCFEmailServices.EmailServiceClient()
    callservice.TestService()
    callservice.Close()
    

    web服务:

        <ServiceContract()> _
        Public Interface IEmailService
    
    
            <OperationContract(IsOneWay:=True)> _
            Sub TestService()
    
    
        End Interface
    
    
        Public Class EmailService
        Implements IEmailService
    
        Public Sub TestService() Implements IEmailService.TestService
    
            Dim srvBody As String = ""
            srvBody = "START: " + DateTime.Now.ToLongTimeString() + System.Environment.NewLine
            Thread.Sleep(10000)
            srvBody += "END: " + DateTime.Now.ToLongTimeString() + System.Environment.NewLine
    
            Me.SendEmail("test@gmail.com", "test", srvBody, Nothing)
    
        End Sub
    
    
        Function SendEmail(ByVal srpTo As String, ByVal srpSubject As String, ByVal srpBody As String, ByVal srpAttachmentPath As String) As Boolean
    
            Dim MailMsg As New MailMessage(New MailAddress("No_Reply@test.com"), New MailAddress(srpTo))
            MailMsg.BodyEncoding = Encoding.UTF8
            MailMsg.Subject = srpSubject
            MailMsg.Body = srpBody
            MailMsg.IsBodyHtml = True
    
            If srpAttachmentPath IsNot Nothing Then
                Dim srvAttachment As New Attachment(srpAttachmentPath)
                MailMsg.Attachments.Add(srvAttachment)
            End If
    
    
            Dim SmtpMail As New SmtpClient("smtp.gmail.com", 587)
            SmtpMail.UseDefaultCredentials = False
            SmtpMail.EnableSsl = True
            SmtpMail.Credentials = New System.Net.NetworkCredential("No_Reply@test", "password")
    
            Try
                SmtpMail.Send(MailMsg)
            Catch
                Return False
            End Try
            Return True
        End Function
    
    End Class
    

    WebConfig:

                <system.serviceModel>
            <bindings>
       <wsHttpBinding>
        <binding name="WSHttpBinding_IEmailService" closeTimeout="00:01:00"
         openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
         bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
         maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text"
         textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
         <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
          maxBytesPerRead="4096" maxNameTableCharCount="16384" />
         <reliableSession ordered="true" inactivityTimeout="00:10:00"
          enabled="false" />
         <security mode="Message">
          <transport clientCredentialType="Windows" proxyCredentialType="None"
           realm="" />
          <message clientCredentialType="Windows" negotiateServiceCredential="true"
           algorithmSuite="Default" establishSecurityContext="true" />
         </security>
        </binding>
       </wsHttpBinding>
      </bindings>
      <client>
       <endpoint address="http://localhost:61450/EmailService.svc" binding="wsHttpBinding"
        bindingConfiguration="WSHttpBinding_IEmailService" contract="WCFEmailServices.IEmailService"
        name="WSHttpBinding_IEmailService">
        <identity>
         <servicePrincipalName value="host/localhost" />
        </identity>
       </endpoint>
      </client>
      <services>
       <service behaviorConfiguration="WCFService.Service1Behavior"
        name="WCFService.Service1">
        <endpoint address="" binding="wsHttpBinding" contract="WCFService.IService1">
         <identity>
             <servicePrincipalName value="host/localhost" />
         </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
       </service>
       <service behaviorConfiguration="ClientWebApp.EmailServiceBehavior"
        name="ClientWebApp.EmailService">
        <endpoint address="" binding="wsHttpBinding" contract="ClientWebApp.IEmailService">
         <identity>
             <servicePrincipalName value="host/localhost" />
         </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
       </service>
      </services>
            <behaviors>
       <serviceBehaviors>
        <behavior name="WCFService.Service1Behavior">
         <serviceMetadata httpGetEnabled="true" />
         <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
        <behavior name="ClientWebApp.EmailServiceBehavior">
         <serviceMetadata httpGetEnabled="true" />
         <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
       </serviceBehaviors>
      </behaviors>
        </system.serviceModel>
    

1 个答案:

答案 0 :(得分:0)

您正在IsOneWay通话后正确关闭客户端。根据您的绑定,close()将阻塞,直到IsOneWay完成。

您可以在此处找到更多信息:Calling Close() on Service Proxy blocks after One Way WCF call

来自此博客的答案:WCF Best Practice #5