2011-10-19 30 views
13

Tôi có một dịch vụ WCF đơn giản tổ chức trong IIS7.5 tiếp xúc với hơn một wsHttp ràng buộc sử dụng bảo mật tin nhắn và InstanceContextMode.PerCallInstances WCF Max dường như bị giới hạn ở 10

Tôi có một giao diện người dùng đơn giản mà quay lên một số cấu hình các chủ đề, mỗi chủ đề gọi dịch vụ.

Tôi đã thêm bộ đếm dịch vụ hỗ trợ perfmonModel4.Instances. Bất kể số lượng các chủ đề được tạo ra và gọi dịch vụ, perfmon cho thấy dịch vụ tạo ra tối đa 10 Trường hợp.

cấu hình khách hàng của tôi là như sau:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 

    <bindings> 
    <wsHttpBinding> 

     <binding name="WSHttpBinding_IService3"> 
     <security mode="Message"> 
      <transport clientCredentialType="Windows" proxyCredentialType="None" 
      realm="" /> 
      <message clientCredentialType="Windows" negotiateServiceCredential="true" 
      algorithmSuite="Default" establishSecurityContext="false" /> 
     </security> 
     </binding> 

    </wsHttpBinding> 
    </bindings> 
    <client> 

    <endpoint address="http://localhost/NGCInstancing/Service3.svc/~/Service3.svc" 
     binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IService3" 
     contract="NGCSecPerCall.IService3" name="WSHttpBinding_IService3"> 
     <identity> 
     <servicePrincipalName value="host/RB-T510" /> 
     </identity> 
    </endpoint> 

    </client> 
</system.serviceModel> 
</configuration> 

dịch vụ cấu hình của tôi là như sau:

<?xml version="1.0"?> 
<system.serviceModel> 
    <configuration> 
     <behaviors> 
      <serviceBehaviors> 
       <behavior name="SecPerCallBehaviour"> 
        <serviceThrottling maxConcurrentCalls="30" maxConcurrentSessions="1000" 
        maxConcurrentInstances="30" /> 
        <serviceMetadata httpGetEnabled="true" /> 
        <serviceDebug includeExceptionDetailInFaults="false" /> 
       </behavior> 
       <behavior name=""> 
        <serviceMetadata httpGetEnabled="true" /> 
        <serviceDebug includeExceptionDetailInFaults="false" /> 
       </behavior> 
      </serviceBehaviors> 
     </behaviors> 
    <bindings> 
     <wsHttpBinding> 
      <binding name="BindingMessageSecPerCall" > 
      <security mode="Message"> 
      <!-- it's by setting establishSecurityContext to false that we enable per call instancing with security --> 
      <message establishSecurityContext="false" /> 
      </security> 
      </binding> 
     </wsHttpBinding> 
    </bindings> 
    <services> 
     <service name="ServiceInstancingDemo.Service3" behaviorConfiguration="SecPerCallBehaviour"> 
     <endpoint address="~/Service3.svc" 
     binding="wsHttpBinding" bindingConfiguration="BindingMessageSecPerCall" 
     contract="ServiceInstancingDemo.IService3" /> 
     </service> 
    </services> 
    </configuration> 
</system.serviceModel> 

Mã khách hàng như sau:

private void btnSecPerCall_Click(object sender, EventArgs e) 
    { 
     int i; 
     int requests; 
     int delay; 

     lblStatus.Text = ""; 

     DateTime startTime = DateTime.Now; 
     this.listBox1.Items.Add("start time=" + DateTime.Now); 

     delay = Convert.ToInt16(txtDelay.Text); 
     requests = Convert.ToInt16(txtRequests.Text); 

     Task<string>[] result; 
     result = new Task<string>[requests]; 

     for (i = 0; i < requests; i++) 
     { 
      result[i] = Task<string>.Factory.StartNew(() => _ngcSecPerCall.WaitThenReturnString(delay)); 
     } 

     for (i = 0; i < requests; i++) 
     { 
      this.listBox1.Items.Add(result[i].Result); 
     } 

     DateTime endTime = DateTime.Now; 
     TimeSpan ts = endTime - startTime; 
     lblStatus.Text = "Finished! Time taken= " + ts.Seconds + " seconds"; 

     this.listBox1.Items.Add("end time=" + DateTime.Now); 
    } 

mã dịch vụ của tôi là như sau:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] 
public class Service3 : IService3 
{ 
    private int m_counter; 

    public string WaitThenReturnString(int waitMilliSeconds) 
    { 
     System.Threading.Thread.Sleep(waitMilliSeconds); 
     int maxT, workCT; 
     System.Threading.ThreadPool.GetMaxThreads(out maxT, out workCT); 
     m_counter++; 
     return String.Format("Incrementing counter to {0}.\r\nSession Id: {1}. Threads {2}, {3}", m_counter, OperationContext.Current.SessionId, maxT, workCT); 
    } 
} 

Dịch vụ trả về 400,400 cho số lượng chủ đề.

Có ai biết tại sao dịch vụ từ chối tạo thêm 10 trường hợp đó không?

Nếu tôi tạo bản sao của dịch vụ nhưng với liên kết wsHttp có <security mode="None"/> thì dịch vụ sẽ tạo ra nhiều trường hợp vui vẻ hơn.

Trả lời

20

Bạn có đang thử nghiệm trên Windows Server hoặc Windows 7 không? Lý do tôi hỏi là IIS trên các phiên bản hệ điều hành khách hàng có một giới hạn kết nối 10. Điều này là để ngăn chặn hệ điều hành khách hàng đang được sử dụng trong một môi trường máy chủ.

+0

Điều này nghe có vẻ đầy hứa hẹn! Tôi đang sử dụng Windows 7. Tôi sẽ triển khai một máy ảo win2008 vào ngày mai và quay trở lại. –

+1

Vâng, đúng vậy. Khi tôi thử nghiệm trên máy ảo Win 2008 nó hoạt động rất tốt. Rất cám ơn Graymatter –

2

MaxConcurrentSessions documentation đề cập đến tối ưu hóa cho các yêu cầu của khách hàng đến từ cùng một AppDomain. Mã mẫu của bạn về cơ bản là nhấn cùng một socket trên dịch vụ. Vì có một số điều chỉnh được thực hiện cho mỗi khách hàng, điều đó có thể ảnh hưởng đến hành vi dịch vụ của bạn. Ngoài ra, 10 xảy ra là giá trị mặc định cho MaxConcurrentSessions vì vậy có thể cấu hình của bạn không thay đổi giá trị mặc định WCF.

Bật bảo mật ảnh hưởng đến tổng số chuỗi vì nó thiết lập "phiên" cho mỗi khách hàng sao cho mỗi yêu cầu được gửi không cần phải được xác thực trên mọi cuộc gọi. "Phiên" bảo mật được tính vào tổng số MaxConcurrentSessions.

+0

Có thể đáng để tôi thêm rằng tôi đã triển khai cùng một dịch vụ với một ràng buộc khác.Ràng buộc mới cũng là wsHttp nhưng có . Khi tôi chạy cùng một máy khách chống lại dịch vụ này thì dịch vụ này sẽ quay vòng hơn 10 lần. Tôi đoán rằng đối với các ràng buộc mới, các phiên không được sử dụng vì không cần phải thiết lập một bối cảnh bảo mật. Tôi nghĩ rằng bạn đang lên một cái gì đó với thực tế là 10 là MaxConcurrentSessions mặc định nhưng tất nhiên cấu hình của tôi cố gắng để thay đổi giá trị này đến 1000. Bất cứ ai biết cách kiểm tra các thiết lập thực tế được sử dụng trong thời gian chạy? –

+0

Tôi đã chuyển các bài kiểm tra của mình lên máy ảo Win2008 và bây giờ nó hoạt động tốt - tôi nhận được 61 trường hợp thay vì 10 lần tôi nhận được trên máy chủ Win7 của mình. Cảm ơn rất nhiều Sixto Saez! –

1

Bạn có đang chạy ứng dụng khách và máy chủ trên cùng một máy không? Sau đó, họ có thể chiến đấu cho các chủ đề có sẵn.

Nếu bạn đang chạy trên một máy tính khác, hãy đảm bảo bạn đã thực hiện các thay đổi cấu hình sau trên cả máy khách và máy chủ.

http://www.codeproject.com/KB/webservices/quickwins.aspx

Có thể là các khách hàng không tạo ra hơn 10 yêu cầu đến máy chủ tương tự. Vì vậy, hãy thử các cấu hình trên trước tiên trên cả máy khách và máy chủ.

Và tất nhiên, bạn phải có Windows Server. Nếu không, nó sẽ là giới hạn IIS trên Windows 7.

Các vấn đề liên quan