0

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

  1. 在不阻塞用户的情况下调用服务
  2. 正确关闭客户端

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

客户:

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

网络服务:

    <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

网络配置:

            <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>
4

1 回答 1

0

您在 IsOneWay 调用后正确关闭了客户端。根据您的绑定, close() 会阻塞,直到 IsOneWay 完成。

您可以在此处找到更多信息:在 One Way WCF 调用后调用服务代理块上的 Close()

并从这个博客中得到答案:WCF Best Practice #5

于 2012-11-14T02:06:31.300 回答