2012-11-13 69 views
0

我对WCF非常陌生,我已经设置了一个测试网站和服务。我想2完成两两件事:如何调用IsOneWay WCF服务并正确关闭客户端

  1. 调用服务而不阻塞用户
  2. 关闭客户端正常

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

客户:

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

的Webservice:

<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("[email protected]", "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("[email protected]"), 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("[email protected]", "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> 

回答

0

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

你可以在这里找到更多的信息:Calling Close() on Service Proxy blocks after One Way WCF call

,并从答案中的这个博客:WCF Best Practice #5

+0

我有点失去了WCF。您建议如何实现无阻塞,正确关闭的客户端? – mga911

+1

根据MSDN,如果客户端需要非阻塞调用 - 您应该实现AsyncPattern操作:http://msdn.microsoft.com/en-us/library/system.servicemodel.operationcontractattribute.asyncpattern.aspx – dhirschl

相关问题