2012-03-30 45 views
5

Tôi đang gặp sự cố với dịch vụ WCF bằng xác thực Windows trên một trong các máy chủ mà tôi đang triển khai (đó là máy Windows Server 2008 R2), trong khi nó hoạt động hoàn hảo trên tất cả các máy khác mà tôi có quyền truy cập (Windows 7, Windows Server 2008 và Windows Server 2008 R2). Tôi quản lý để tái tạo vấn đề với một ứng dụng mẫu thực sự đơn giản mà nhiều hơn hoặc ít hơn hoàn toàn loại trừ mã của tôi là nguyên nhân của vấn đề.Không thể thực hiện URL khi gọi dịch vụ WCF có xác thực Windows

Việc áp dụng tối thiểu tôi có thể tạo lại vấn đề với một sửa đổi nhỏ của mẫu dự án dịch vụ WCF:

[ServiceContract] 
public interface IService1 
{ 
    [OperationContract] 
    string GetData(int value); 
} 

[AspNetCompatibilityRequirements(RequirementsMode=AspNetCompatibilityRequirementsMode.Allowed)] 
public class Service1 : IService1 
{ 
    public string GetData(int value) 
    { 
     return string.Format("You entered: {0}\nUsername: {1}", 
      value, 
      ServiceSecurityContext.Current == null ? 
       "<null>" : 
       ServiceSecurityContext.Current.PrimaryIdentity.Name); 
    } 
} 

Về cơ bản tôi kích hoạt ASP.NET tương thích (tôi cần nó vì mã thực tế sử dụng một HttpHandler cho xác thực) và tên người dùng của người dùng đã được xác thực được trả về.

Nội dung web.config như sau:

<?xml version="1.0"?> 
<configuration> 
    <system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    <authentication mode="Windows"/> 
    </system.web> 
    <system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="ServiceBehavior"> 
      <serviceMetadata httpGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="HttpWindowsBinding" maxReceivedMessageSize="2147483647"> 
      <readerQuotas maxBytesPerRead="2147483647" maxArrayLength="2147483647" maxStringContentLength="2147483647" maxNameTableCharCount="2147483647" maxDepth="2147483647"/> 
      <security mode="TransportCredentialOnly"> 
      <transport clientCredentialType="Windows" /> 
      </security> 
     </binding> 
     </basicHttpBinding> 
    </bindings> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" /> 
    <services> 
     <service name="TestService.Service1" behaviorConfiguration="ServiceBehavior"> 
     <endpoint address="" 
        binding="basicHttpBinding" 
        bindingConfiguration="HttpWindowsBinding" 
        contract="TestService.IService1" /> 
     <endpoint address="problem" 
        binding="basicHttpBinding" 
        bindingConfiguration="HttpWindowsBinding" 
        contract="TestService.IService1" /> 
     </service> 
    </services> 
    </system.serviceModel> 
    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    </system.webServer> 
</configuration> 

Chú ý hai điểm đầu cuối: một với địa chỉ mặc định, một trong những khác với một địa chỉ tương đối. Gọi là người đầu tiên thành công ngay cả trên các máy chủ có vấn đề, trong khi cuộc gọi đến một giây thất bại với lỗi sau:

Exception type: HttpException 
Exception message: Failed to Execute URL. 
at System.Web.Hosting.ISAPIWorkerRequestInProcForIIS6.BeginExecuteUrl(String url, String method, String childHeaders, Boolean sendHeaders, Boolean addUserIndo, IntPtr token, String name, String authType, Byte[] entity, AsyncCallback cb, Object state) 
at System.Web.HttpResponse.BeginExecuteUrlForEntireResponse(String pathOverride, NameValueCollection requestHeaders, AsyncCallback cb, Object state) 
at System.Web.DefaultHttpHandler.BeginProcessRequest(HttpContext context, AsyncCallback callback, Object state) 
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 

Cuộc gọi chỉ thất bại khi đường ống cổ điển được sử dụng (tôi cần nó vì HttpHandler, nhưng vấn đề có thể được sao chép ngay cả khi không có nó). Với đường ống tích hợp, vấn đề đã biến mất. Ngoài ra nếu tôi vô hiệu hóa xác thực Windows, sự cố cũng biến mất:

<binding name="HttpBinding" maxReceivedMessageSize="2147483647"> 
    <readerQuotas maxBytesPerRead="2147483647" maxArrayLength="2147483647" maxStringContentLength="2147483647" maxNameTableCharCount="2147483647" maxDepth="2147483647"/> 
    <security mode="None"> 
    <transport clientCredentialType="None" /> 
    </security> 
</binding> 

Tôi đã nhận thấy một chi tiết khác có đăng ký HttpHandler. Giá trị của thuộc tính HttpRequest.CurrentExecutionFilePath cho điểm cuối có địa chỉ tương đối khác nhau giữa máy chủ có vấn đề (~/Service1.svc/problem) và các máy chủ làm việc (~/Service1.svc). Mặc dù tôi không quen thuộc với IIS, tôi nghi ngờ điều này có thể gợi ý nguyên nhân của vấn đề - có thể một cái gì đó liên quan đến việc định tuyến các yêu cầu?

Tôi đang hết ý tưởng vì vậy tôi đăng bài này ở đây với hy vọng ai đó sẽ nhận ra vấn đề có thể là gì. Bất kỳ đề nghị được hoan nghênh.

+1

Bạn có ghi đè URL trên IIS được bật không? Điều này có mùi giống như một vấn đề cho phép của một số loại. [Sự khác biệt giữa chế độ đường ống Cổ điển và Tích hợp trong IIS7 là gì?] (Http://stackoverflow.com/questions/3062709/what-is-the-difference-between-classic-and-integrated-pipeline-mode-in- iis7) Có thể hữu ích. –

+0

@PetarVucetin Tôi đã kiểm tra và ghi đè URL không được bật trên máy chủ.Trong khi nhận xét của bạn không trả lời chính xác câu hỏi của tôi, liên kết bạn cung cấp cho tôi một số ý tưởng - tôi đã quản lý cấu hình lại ứng dụng của mình để làm cho nó hoạt động với chế độ đường ống tích hợp, nơi vấn đề không tự biểu hiện. Tôi vẫn muốn biết làm thế nào để làm cho nó hoạt động trong chế độ đường ống cổ điển, nhưng nếu tôi không nhận được một câu trả lời tốt hơn làm rõ rằng đối với tôi, bình luận của bạn là ứng cử viên tốt nhất cho tiền thưởng. Nó đã giúp tôi giải quyết vấn đề trước mắt. –

+0

Cảm ơn Damir. Khi tôi có thời gian, tôi có thể cố gắng để repro vấn đề. Nó chỉ cù xương gỡ lỗi của tôi ... –

Trả lời

0

Vấn đề có thể là địa chỉ "~/Service1.svc/vấn đề"

Khi địa chỉ là "~/Service1.svc" cuộc gọi lượt truy cập các tập tin svc, và sử dụng thông tin trong hồ sơ để tìm giao diện và sau đó là cấu hình cho giao diện đó.

Khi bạn sử dụng một địa chỉ tương đối không có tệp svc, nó sẽ xem địa chỉ trong tệp cấu hình.

Bạn có một thư mục "Service1.svc" trên một trong các máy chủ hoặc là địa chỉ không có ".svc" trên máy chủ nơi nó hoạt động không?

+0

Không. Trong khi khắc phục sự cố cho các mục đích thử nghiệm, tôi đã tạo một ứng dụng mới trên tất cả các máy chủ chỉ với các tệp từ dự án thử nghiệm được đề cập ở trên: 'Service1.svc',' Web.config', 'bin \ TestService.dll'. –

1

Bạn có ghi đè URL trên IIS được bật không? Điều này có mùi giống như một vấn đề cho phép của một số loại. What is the difference between Classic and Integrated pipeline mode in IIS7? Có thể hữu ích.

+0

Cảm ơn bạn đã liên kết. Nó đã cho tôi đọc về sự khác biệt và cuối cùng tôi quản lý để làm cho ứng dụng của tôi làm việc trong chế độ đường ống tích hợp. Tôi vẫn tò mò tại sao nó không hoạt động ở chế độ đường ống cổ điển trên máy chủ đó. –

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