Aracılı hizmetlerle ilgili sorunları giderme
Şunlar için geçerlidir: Visual Studio 2019 ve sonraki sürümleri
Bu makalede, Visual Studio SDK'sında aracılı bir hizmet almaya çalıştığınızda oluşabilecek bazı yaygın sorunlara yönelik sorun giderme önerileri ve olası çözümler tanıtılmaktadır.
Aracılı hizmetler çeşitli yollarla başarısız olabilir. Araştırmanızı başlatmak için yararlı bir teknik, aracılı hizmetlerle işler yolunda gitmediğinde genellikle hataları veya uyarıları günlüğe kaydeden Visual Studio Etkinlik Günlüğü'nü denetlemektir.
Hizmet isteğinde bulunma sorunları
Aracılı hizmetlerle ilgili en yaygın zorluk, veya IServiceBroker.GetPipeAsyncçağrısından IServiceBroker.GetProxyAsync aldıkları sonucu veya özel durumu anlamak olabilir. Aracılı IServiceBroker bir hizmetin nerede ve nasıl etkinleştirilebileceğiyle ilgili endişeleri kasıtlı olarak soyutlar. Ancak işler yolunda gitmediğinde sorunu tanılamak ve düzeltmek için daha ayrıntılı detaya gitmek gerekir.
Hizmet yok
Bir hizmet isteğinin sonucu, aşağıdaki koşullardan herhangi biri doğru olduğunda olabilir null
:
- İstenen hizmet kayıtlı değil. Aracılı hizmet yazarı bunu veya el ile ProvideBrokeredServiceAttribute yazılmış bir .pkgdef dosyasına kaydetmelidir.
- İstenen hizmet, hizmeti bu istemcide kullanıma sunmayan yapılandırmaya kayıtlı. Varsayılan kapsam olan ServiceAudience.Process, aracılı hizmetin yalnızca istemciyle aynı işlemden getirildiğinde etkinleştirilebileceği anlamına gelir. İstemci başka bir işlemdeyse ve amaç aracılı hizmetin bu hizmet için kullanılabilir olmasıysa, hizmet kaydını değiştirerek öğesini ServiceAudiencegenişletin.
- İstenen hizmet ile ServiceAudience.LiveShareGuestkaydedildi, bir Canlı Paylaşım bağlantısı var, ancak konak aracılı hizmeti sunmaz veya ProvideBrokeredServiceAttribute.AllowTransitiveGuestClients özellik olarak
true
ayarlanmamıştır. Live Share üzerinden aracılı bir hizmeti ifşa ederken lütfen Aracılı hizmetin güvenliğini sağlama'yı gözden geçirin. - İstenen hizmet kaydedildi, ancak hangi paketin başlatılacağıyla ilgili bilgiler eksik, böylece fabrikasının kullanıma sunulabilmesi için. özniteliği, Visual Studio'un ProvideBrokeredServiceAttribute gerektiğinde bu paketi yükleyebilmesi için özniteliğin uygulandığı paketi gösteren kaydı otomatik olarak oluşturur. Öznitelik yanlış pakete uygulanmışsa veya .pkgdef dosyası el ile yazılmışsa, bu bilgiler eksik veya yanlış olabilir.
- Aracılı hizmetin başlatılmasından sorumlu Visual Studio paketi başlatma sırasında oluşturur veya başka bir şekilde bu hizmet fabrikasını gerçekten sunamıyor. Paket yükleme hatasının kanıtı için Visual Studio Etkinlik Günlüğü'nü denetleyin.
- Hizmet fabrikasının kendisi döndürür
null
.
Hizmet isteği bir özel durum oluşturur
Bir hizmet isteği, hizmet fabrikası bir özel durum oluştururken bir atabilir ServiceCompositionException . Bu, yukarıda listelenen ve sonuç null
doğuracak tüm sorunların geçerli olmadığı anlamına gelir. Neyin yanlış gittiğini anlamak ve istemcide veya hizmet fabrikasında gerekli düzeltmeleri yapmak için özel durum ayrıntılarına (iç özel durumlar dahil) bakın.
Uzak bir hizmet beklenirken yerel bir hizmet alırsınız
Hizmet kaydına ve Visual Studio'nun geçerli durumuna bağlı olarak istek yerel olarak veya uzaktan gerçekleştirilebilir. Varsayılan kapsam olan ServiceAudience.Process, aracılı hizmetin yalnızca istemciyle aynı işlemden getirildiğinde etkinleştirilebileceği anlamına gelir.
Aracılı bir hizmetin Bir Live Share konağından bağlı bir konukla paylaşılması gerektiğinde ancak ServiceAudience bu hizmet yerel kapsamlarla sınırlıysa, Live Share konuğundan gelen bir istek, aracılı hizmeti konak yerine aynı makineden etkinleştirir. Live Share üzerinden aracılı hizmetlerinizi kullanıma sunabilmek için kaydı dahil ServiceAudience.LiveShareGuest etmek üzere güncelleştirin. Ayrıca olarak da ayarlamanız ProvideBrokeredServiceAttribute.AllowTransitiveGuestClientstrue
gerekebilir.
Önemli
Aracılı hizmetin kaydının hem Live Share konuğunda hem de konakta bulunması ve konuğun aracılı hizmeti konaktan etkinleştirmesini desteklemesi gerekir.
Live Share üzerinden aracılı bir hizmeti ifşa ederken lütfen Aracılı hizmetin güvenliğini sağlama'yı gözden geçirin.
Hizmet sağlama sorunları
Aracılı hizmet MEF aracılığıyla dışarı aktarılmadığı sürece aracılı hizmet, aracılı hizmet sağlama bölümünde açıklandığı gibi bir AsyncPackage sınıftan gönderilmelidir.
Aracılı hizmet sağlama girişimi, bu koşullardan herhangi biri doğruysa bir özel durum oluşturur:
- Kullanıma sunulan hizmetin adı, kayıtlı bir hizmetle (ad ve sürüm) tam olarak eşleşmiyor.
- Aynı hizmet adı için zaten bir fabrikanın adı verilmiştir.
çağrısının IBrokeredServiceContainer.Proffer sonucu bir IDisposable'dir. Bu değer atıldıktan sonra aracılı bir hizmet yeni istekler için kullanılamaz hale gelir. Aracılı hizmetinizin açık bir çözüm gibi bazı bağlamlara özgü benceliği olduğunda, aracılı hizmeti yalnızca söz konusu bağlam etkin olduğunda önermek uygun olabilir. Paketiniz atıldığında bu değerin saklanması ve atılması gerekmez.
İstemci ve hizmet arasında RPC izleme
İstemci ve hizmet arasında bir bağlantı kurulduktan sonra, özellikle farklı işlemlerde olduklarında iletişimlerini izlemek yararlı olabilir.
Varsayılan olarak, işlemlere yayılan aracılı hizmetler (RPC'nin uyguladığı gibi) arasındaki iletişimlerin izlemeleri dizinde bulunan .svclog dosyalarına %TEMP%\VSLogs
kaydedilir. Bu xml dosyaları en iyi şekilde Hizmet İzleme Görüntüleyicisi ile görüntülenir. Bu araç bir kerede birçok .svclog dosyasını açabilir ve istemci ile hizmet arasındaki RPC'yi anlamanın çok daha kolay olması için bunları bir araya getirerek çok taraflı bir grafik oluşturabilir.
Aracılı bir hizmet doğrudan bu .svclog izleme dosyalarına eklemek için izleyebilir ve aracılı hizmet davranışının tanılamasına daha fazla yardımcı olabilir. "Sorun Bildir" komutu çağrıldığında ve kullanıcı günlükleri paylaşmayı seçtiyse, kaydedilen %TEMP%\VSLogs
tüm izlemeler toplanabilir.
Kolayca bulunabilecekleri ve diğer .svclog izlemeleriyle birleştirilebileceği şekilde kendi iletilerinizi izlemek için kodunuz (aracılı hizmet olsun veya olmasın) aşağıdaki gibi bir şey yapabilir:
// Define your log's ID, a namespace-like fully qualified name.
// In general it is expected that you follow you team's assembly namespace.
// Also an optional parameter, the ServiceMoniker for your service
var myLogId = new LogId("Microsoft.SomeTeam.MyLogName", serviceId: null);
var requestedLevel = new LoggingLevelSettings(SourceLevels.Warning | SourceLevels.ActivityTracing);
var myLogOptions = new LoggerOptions(requestedLevel, PrivacyFlags.MayContainPrivateInformation);
TraceSource myTraceSource;
using (TraceConfiguration traceConfig = await TraceConfiguration.CreateTraceConfigurationInstanceAsync(serviceBroker, ownsServiceBroker: false, cancellationToken))
{
myTraceSource = await traceConfig.RegisterLogSourceAsync(myLogId, myLogOptions, traceSource: null, cancellationToken);
}
myTraceSource
artık izlemelerinizi bir .svclog dosyasına yazmak için uygun dinleyiciler eklendiğinden izleme için kullanılabilir. Kullanmak istediğiniz bir TraceSource dosyanız varsa, bunu yöntemine RegisterLogSourceAsync geçirin ve dinleyiciler var olan TraceSourceöğesine eklendiğinden sonucu atın.
Uzak istemciye hizmet veren aracılı bir hizmetten izlendiğinde, hizmet izleme görüntüleyicisini kullanarak bütünsel bir görünüm görmek için ExecutionContext svclog'un istemcinin svclog'ıyla bir araya getirilebilmesini sağlayan, kodunuzun içinde çalıştığı öğesine otomatik olarak bir etkinlik atanır.