0

私は WCF を初めて使用し、テスト Web サイトとサービスをセットアップしました。私は2つのことを達成しようとしています:

  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 呼び出しの後、クライアントを適切に閉じています。バインディングに基づいて、IsOneWay が完了するまで close() がブロックされます。

詳細については、こちらを参照してください: Calling Close() on Service Proxy blocks after One Way WCF call

回答内のこのブログから:WCFベストプラクティス#5

于 2012-11-14T02:06:31.300 に答える