2012-03-30 52 views
5

Çalışırken kullandığım sunuculardan birinde Windows kimlik doğrulaması kullanan bir WCF hizmeti ile ilgili bir sorun yaşıyorum (bu bir Windows Server 2008 R2 makinesi) Erişim sağladığım diğer tüm makinelerde sorunsuz (Windows 7, Windows Server 2008 ve Windows Server 2008 R2). Sorunu neden olarak kodumu az çok tamamen hariç tutan gerçekten basit bir örnek uygulama ile yeniden üretmeyi başardım. gerçek kod bir HttpHandler için kullanması nedeniyle Windows kimlik doğrulamasıyla bir WCF hizmeti çağrılırken URL çalıştırılamadı

[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); 
    } 
} 

Temelde ben ASP.NET uyumluluğu etkin (ben ihtiyaç: Birlikte sorunu yeniden

minimum uygulama WCF hizmeti projesi şablonunun küçük değişikliktir kimlik doğrulama) ve kimliği doğrulanmış kullanıcının kullanıcı adı döndürülür.

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

Bildirim iki bitiş noktaları: varsayılan adresine sahip bir göreli bir adresle diğeri şöyle web.config ait

içeriği vardır. İlki çağrılması ikincisi çağrısı aşağıdaki hata nedeniyle başarısız olurken, hatta sorunlu sunucuda başarılı:

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) 
klasik boru hattı kullanıldığında sadece başarısız çağrı (çünkü httphandler ait ihtiyaç

ama sorun bile o olmadan çoğaltılabilir). Entegre boru hattı ile sorun ortadan kalktı. Windows kimlik doğrulamasını devre dışı Ayrıca, sorun de gitti:

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

Ben kayıtlı bir httphandler başka ayrıntı fark etmiş. Göreli adresle son nokta için HttpRequest.CurrentExecutionFilePath özelliğinin değeri, sorunlu sunucu (~/Service1.svc/problem) ve çalışma sunucuları (~/Service1.svc) arasında farklılık gösterir. Her ne kadar IIS'e çok aşina olmasam da, bunun sorunun nedenini ima edebileceğinden şüpheleniyorum - belki de isteklerin yönlendirilmesiyle ilgili bir şey var mı?

Fikirlerim tükeniyor, bu yüzden burada birisinin sorunun ne olduğunu anlayacağı umuduyla gönderiyorum. Herhangi bir öneri kabul edilir.

+1

IIS'de URL yeniden yazma işleminiz var mı? Bu bir çeşit izin konusu gibi kokuyor. [IIS7'deki Klasik ve Tümleşik boru hattı modu arasındaki fark nedir?] (Http://stackoverflow.com/questions/3062709/what-is-the-difference-between-classic-and-integrated-pipeline-mode-in- iis7) Yardımcı olabilir. –

+0

@PetarVucetin Kontrol ettim ve URL yeniden yazmayı sunucuda etkin değil.Yorumunuz tam olarak soruma cevap vermezken, sağladığınız bağlantı bana bazı fikirler verdi. Uygulamamın, sorunun kendisini göstermediği entegre boru hattı moduyla çalışması için yeniden yapılandırmayı başardım. Hala klasik boru hattı modunda çalışmayı nasıl yapacağımı bilmek isterdim, ancak daha iyi bir cevap almazsam benim için yorumunuz, ödül için en uygun adaydır. Her şeyden önce, acil sorunu çözmemi sağladı. –

+0

Teşekkürler Damir. Biraz zamanım olduğunda, konuyu yeniden yorumlamaya çalışabilirim. Sadece hata ayıklama kemiğimi gıdıklıyor ... –

cevap

0

sorun olabilir adresi "~/Service1.svc/sorun"

adresidir

"~/Service1.svc" çağrısı svc dosyası vurur ve bulmak için dosyadaki bilgileri kullanır arayüz ve daha sonra bu arayüz için konfigürasyon.

Bir svc dosyası olmadan göreceli bir adres kullandığınızda, yapılandırma dosyasındaki adrese bakar.

Sunuculardan birinde "Service1.svc" bir dizininiz var mı, yoksa sunucunun çalıştığı sunucudaki ".svc" adresi var mı?

+0

Ne de. Test amaçlı sorun giderme sırasında, sadece yukarıda belirtilen test projesinden dosyaları olan tüm sunucularda yeni bir uygulama oluşturdum: 'Service1.svc',' Web.config', 'bin \ TestService.dll'. –

1

IIS'de URL yeniden yazma işleminiz var mı? Bu bir çeşit izin konusu gibi kokuyor. What is the difference between Classic and Integrated pipeline mode in IIS7? Yardımcı olabilir.

+0

Bağlantı için teşekkürler. Farklarımı okumamı sağladı ve sonunda uygulamamın entegre boru hattı modunda çalışmasını sağladım. Yine de, bu sunucuda neden klasik boru hattı modunda çalışmadığını merak ediyorum. –

İlgili konular