Delen via


Snelstartgids voor probleemoplossing voor WCF

In dit onderwerp vindt u een aantal bekende problemen die klanten ondervinden bij het ontwikkelen van WCF-clients en -services. Als het probleem dat u ondervindt zich niet in deze lijst bevindt, raden we u aan tracering voor uw service te configureren. Hiermee wordt een traceringsbestand gegenereerd dat u kunt bekijken met de traceringsbestandsviewer en gedetailleerde informatie krijgt over uitzonderingen die zich in de service kunnen voordoen. Zie voor meer informatie over het configureren van tracering: Tracering configureren. Zie het hulpprogramma Service Trace Viewer (SvcTraceViewer.exe) voor meer informatie over de viewer voor traceringsbestanden.

  1. Na de installatie van Windows 7 en IIS, wanneer ik naar een WCF-service probeer te bladeren, krijg ik het volgende foutbericht: HTTP-fout 404.3 – Niet gevonden

    HTTP-fout 404.3: de pagina die u aanvraagt, kan niet worden geleverd vanwege de extensieconfiguratie. Als de pagina een script is, voegt u een handler toe. Als het bestand moet worden gedownload, voegt u een MIME-kaart toe. Gedetailleerde Error InformationModule StaticFileModule.

  2. Soms ontvang ik een MessageSecurityException op de tweede aanvraag als mijn client een tijdje na de eerste aanvraag inactief is. Wat gebeurt er?

  3. Mijn service begint nieuwe clients te weigeren nadat ongeveer 10 clients ermee werken. Wat gebeurt er?

  4. Kan ik mijn serviceconfiguratie ergens anders laden dan het configuratiebestand van de WCF-toepassing?

  5. Mijn service en client werken geweldig, maar ik kan ze niet laten werken wanneer de client zich op een andere computer bevindt? Wat gebeurt er?

  6. Wanneer ik een FaultException-uitzondering<> gooi waarbij het type een uitzondering is, ontvang ik altijd een algemeen FaultException-type op de client en niet het algemene type. Wat gebeurt er?

  7. Het lijkt erop dat bewerkingen in één richting en aanvraag-antwoordbewerkingen ongeveer dezelfde snelheid retourneren wanneer het antwoord geen gegevens bevat. Wat is er gaande?

  8. Ik gebruik een X.509-certificaat met mijn service en ik krijg een System.Security.Cryptography.CryptographicException. Wat gebeurt er?

  9. Ik heb de eerste parameter van een bewerking gewijzigd van hoofdletters in kleine letters; nu gooit mijn cliënt een uitzondering. Wat is er gaande?

  10. Ik gebruik een van mijn traceringshulpprogramma's en ik krijg een EndpointNotFoundException. Wat gebeurt er?

  11. Wanneer u een WCF-web-HTTP-toepassing aanroept vanuit een WCF SOAP-toepassing, retourneert de service de volgende fout: methode 405 Niet toegestaan

Wat is het basisadres? Hoe verhoudt het zich tot een eindpuntadres?

Na de installatie van Windows 7 en IIS, wanneer ik naar een WCF-service probeer te bladeren, krijg ik het volgende foutbericht: HTTP-fout 404.3 – Niet gevonden

Het volledige foutbericht is:

HTTP-fout 404.3: de pagina die u aanvraagt, kan niet worden geleverd vanwege de extensieconfiguratie. Als de pagina een script is, voegt u een handler toe. Als het bestand moet worden gedownload, voegt u een MIME-kaart toe. Gedetailleerde Error InformationModule StaticFileModule.

Dit foutbericht treedt op wanneer HTTP-activering van Windows Communication Foundation niet expliciet is ingesteld in de Configuratiescherm. Als u dit wilt instellen, gaat u naar de Configuratiescherm door in de linkerbenedenhoek van het venster op Programma's te klikken. Klik op Windows-functies in- of uitschakelen. Vouw Microsoft .NET Framework 3.5.1 uit en selecteer HTTP-activering van Windows Communication Foundation.

Soms ontvang ik een MessageSecurityException op de tweede aanvraag als mijn client een tijdje na de eerste aanvraag inactief is. Wat gebeurt er?

De tweede aanvraag kan voornamelijk om twee redenen mislukken: (1) er is een time-out opgetreden voor de sessie of (2) de webserver die als host fungeert voor de service, wordt gerecycled. In het eerste geval is de sessie geldig totdat er een time-out optreedt voor de service. Wanneer de service geen aanvraag van de client ontvangt binnen de periode die is opgegeven in de binding van de service (ReceiveTimeout), beëindigt de service de beveiligingssessie. Volgende clientberichten resulteren in de MessageSecurityException. De client moet een beveiligde sessie opnieuw tot stand brengen met de service om toekomstige berichten te verzenden of een stateful beveiligingscontexttoken te gebruiken. Stateful beveiligingscontexttokens bieden ook een beveiligde sessie de mogelijkheid om een webserver te overleven die wordt gerecycled. Zie How to: Create a Security Context Token for a Secure Session(s) voor meer informatie over het gebruik van stateful beveiligde contexttokens in een beveiligde sessie. U kunt ook beveiligde sessies uitschakelen. Wanneer u de <wsHttpBinding-binding> gebruikt, kunt u de establishSecurityContext eigenschap instellen om false beveiligde sessies uit te schakelen. Als u beveiligde sessies voor andere bindingen wilt uitschakelen, moet u een aangepaste binding maken. Zie Een aangepaste binding maken met behulp van securityBindingElement voor meer informatie over het maken van een aangepaste binding. Voordat u een van deze opties toepast, moet u de beveiligingsvereisten van uw toepassing begrijpen.

Mijn service begint nieuwe clients te weigeren nadat ongeveer 10 clients ermee werken. Wat gebeurt er?

Standaard kunnen services slechts 10 gelijktijdige sessies hebben. Als de servicebindingen sessies gebruiken, accepteert de service daarom nieuwe clientverbindingen totdat het dat nummer bereikt, waarna nieuwe clientverbindingen worden geweigerd totdat een van de huidige sessies eindigt. U kunt op verschillende manieren meer clients ondersteunen. Als uw service geen sessies vereist, gebruikt u geen sessieful binding. (Zie voor meer informatie Sessies gebruiken.) Een andere optie is om de sessielimiet te verhogen door de waarde van de MaxConcurrentSessions eigenschap te wijzigen in het nummer dat geschikt is voor uw situatie.

Kan ik mijn serviceconfiguratie ergens anders laden dan het configuratiebestand van de WCF-toepassing?

Ja, u moet echter een aangepaste ServiceHost klasse maken waarmee de ApplyConfiguration methode wordt overschreven. In die methode kunt u de basis eerst aanroepen om de configuratie te laden (als u ook de standaardconfiguratiegegevens wilt laden), maar u kunt ook het systeem voor het laden van de configuratie volledig vervangen. Als u de configuratie wilt laden van een configuratiebestand dat verschilt van het configuratiebestand van de toepassing, moet u het configuratiebestand zelf parseren en de configuratie laden.

In het volgende codevoorbeeld ziet u hoe u de ApplyConfiguration methode overschrijft en een eindpunt rechtstreeks configureert.

public class MyServiceHost : ServiceHost  
{  
    public MyServiceHost(Type serviceType, params Uri[] baseAddresses)
      : base(serviceType, baseAddresses)  
    {
        Console.WriteLine("MyServiceHost Constructor");
    }  
  
    protected override void ApplyConfiguration()  
    {  
        string straddress = GetAddress();  
        Uri address = new Uri(straddress);  
        Binding binding = GetBinding();  
        base.AddServiceEndpoint(typeof(IData), binding, address);  
    }  
  
    string GetAddress()  
    {
        return "http://MyMachine:7777/MyEndpointAddress/";
    }  
  
    Binding GetBinding()  
    {  
        WSHttpBinding binding = new WSHttpBinding();  
        binding.Security.Mode = SecurityMode.None;  
        return binding;  
    }  
}  

Mijn service en client werken geweldig, maar ik kan ze niet laten werken wanneer de client zich op een andere computer bevindt? Wat gebeurt er?

Afhankelijk van de uitzondering kunnen er verschillende problemen zijn:

  • Mogelijk moet u de adressen van het clienteindpunt wijzigen in de hostnaam en niet 'localhost'.

  • Mogelijk moet u de poort naar de toepassing openen. Zie Firewall-instructies uit de SDK-voorbeelden voor meer informatie.

  • Zie het voorbeeldonderwerp Over het uitvoeren van de Windows Communication Foundation-voorbeelden voor andere mogelijke problemen.

  • Als uw client Windows-referenties gebruikt en de uitzondering een SecurityNegotiationExceptionis, configureert u Kerberos als volgt.

    1. Voeg de identiteitsreferenties toe aan het eindpuntelement in het app.config-bestand van de client:

      <endpoint
        address="http://MyServer:8000/MyService/"
        binding="wsHttpBinding"
        bindingConfiguration="WSHttpBinding_IServiceExample"
        contract="IServiceExample"
        behaviorConfiguration="ClientCredBehavior"
        name="WSHttpBinding_IServiceExample">  
        <identity>  
          <userPrincipalName value="name@corp.contoso.com"/>  
        </identity>  
      </endpoint>  
      
    2. Voer de zelf-hostende service uit onder het systeem- of netwerkserviceaccount. U kunt deze opdracht uitvoeren om een opdrachtvenster te maken onder het systeemaccount:

      at 12:36 /interactive "cmd.exe"  
      
    3. Host de service onder IIS (Internet Information Services), die standaard het SPN-account (Service Principal Name) gebruikt.

    4. Registreer een nieuwe SPN bij het domein met Behulp van SetSPN. U moet een domeinbeheerder zijn om dit te kunnen doen.

Zie Beveiligingsconcepten die worden gebruikt in WCF en voor meer informatie over het Kerberos-protocol:

Wanneer ik een FaultException-uitzondering<> gooi waarbij het type een uitzondering is, ontvang ik altijd een algemeen FaultException-type op de client en niet het algemene type. Wat gebeurt er?

Het wordt ten zeerste aanbevolen dat u uw eigen aangepaste foutgegevenstype maakt en declareert dat als het detailtype in uw foutcontract. De reden hiervoor is dat het gebruik van door het systeem geleverde uitzonderingstypen:

  • Hiermee maakt u een typeafhankelijkheid die een van de grootste sterke punten van servicegerichte toepassingen verwijdert.

  • Kan niet afhankelijk zijn van uitzonderingen die op een standaardmethode worden geserialiseerd. Sommige, zoals SecurityException, kunnen helemaal niet serialiseerbaar zijn.

  • Maakt interne implementatiedetails beschikbaar voor clients. Zie Opgeven en afhandelen van fouten in contracten en services voor meer informatie.

Als u echter fouten in een toepassing opspoort, kunt u uitzonderingsinformatie serialiseren en naar de client retourneren met behulp van de ServiceDebugBehavior klasse.

Het lijkt erop dat bewerkingen in één richting en aanvraag-antwoordbewerkingen ongeveer dezelfde snelheid retourneren wanneer het antwoord geen gegevens bevat. Wat is er gaande?

Als u opgeeft dat een bewerking één manier is, betekent dit alleen dat het bewerkingscontract een invoerbericht accepteert en geen uitvoerbericht retourneert. In WCF worden alle clientaanroepen geretourneerd wanneer de uitgaande gegevens naar de kabel zijn geschreven of als er een uitzondering wordt gegenereerd. Bewerkingen in één richting werken op dezelfde manier en kunnen worden veroorzaakt als de service niet kan worden gevonden of geblokkeerd als de service niet is voorbereid om de gegevens van het netwerk te accepteren. Meestal resulteert dit in WCF in eenrichtingsgesprekken die sneller terugkeren naar de client dan aanvraag-antwoord; maar elke voorwaarde die het verzenden van de uitgaande gegevens via het netwerk vertraagt, vertraagt bewerkingen in één richting en bewerkingen voor het beantwoorden van aanvragen. Zie One-Way Services en Accessing Services met behulp van een WCF-client voor meer informatie.

Ik gebruik een X.509-certificaat met mijn service en ik krijg een System.Security.Cryptography.CryptographicException. Wat gebeurt er?

Dit gebeurt meestal na het wijzigen van het gebruikersaccount waaronder het IIS-werkproces wordt uitgevoerd. Als u bijvoorbeeld in Windows XP het standaardgebruikersaccount wijzigt dat door de Aspnet_wp.exe wordt uitgevoerd van ASPNET naar een aangepast gebruikersaccount, wordt deze fout mogelijk weergegeven. Als u een persoonlijke sleutel gebruikt, moet het proces dat deze gebruikt, machtigingen hebben voor toegang tot het bestand dat die sleutel opslaat.

Als dit het geval is, moet u leestoegangsbevoegdheden geven voor het account van het proces voor het bestand met de persoonlijke sleutel. Als het IIS-werkproces bijvoorbeeld wordt uitgevoerd onder het Bob-account, moet u Bob leestoegang geven tot het bestand met de persoonlijke sleutel.

Zie Hoe u X.509-certificaten toegankelijk maakt voor WCF voor meer informatie over het verlenen van de juiste gebruikersaccounttoegang tot het bestand dat de persoonlijke sleutel voor een specifiek X.509-certificaat bevat.

Ik heb de eerste parameter van een bewerking gewijzigd van hoofdletters in kleine letters; nu gooit mijn cliënt een uitzondering. Wat is er gaande?

De waarden van de parameternamen in de bewerkingshandtekening maken deel uit van het contract en zijn hoofdlettergevoelig. Gebruik het System.ServiceModel.MessageParameterAttribute kenmerk wanneer u onderscheid moet maken tussen de naam van de lokale parameter en de metagegevens die de bewerking voor clienttoepassingen beschrijven.

Ik gebruik een van mijn traceringshulpprogramma's en ik krijg een EndpointNotFoundException. Wat gebeurt er?

Als u een traceringsprogramma gebruikt dat niet het door het systeem geleverde WCF-traceringsmechanisme is en u ontvangt een EndpointNotFoundException hulpprogramma dat aangeeft dat er een adresfilter niet overeenkomt, moet u de ClientViaBehavior klasse gebruiken om de berichten naar het traceringshulpprogramma te sturen en het hulpprogramma deze berichten omleiden naar het serviceadres. De ClientViaBehavior klasse wijzigt de Via adresseringsheader om het volgende netwerkadres afzonderlijk van de uiteindelijke ontvanger op te geven, aangegeven door de To adresseringsheader. Wanneer u dit doet, wijzigt u echter niet het eindpuntadres, dat wordt gebruikt om de To waarde vast te stellen.

In het volgende codevoorbeeld ziet u een voorbeeld van een clientconfiguratiebestand.

<endpoint
  address="http://localhost:8000/MyServer/"  
  binding="wsHttpBinding"  
  bindingConfiguration="WSHttpBinding_IMyContract"  
  behaviorConfiguration="MyClient"
  contract="IMyContract"
  name="WSHttpBinding_IMyContract">  
</endpoint>  
<behaviors>  
  <endpointBehaviors>  
    <behavior name="MyClient">  
      <clientVia viaUri="http://localhost:8001/MyServer/"/>  
    </behavior>  
  </endpointBehaviors>  
</behaviors>  

Wat is het basisadres? Hoe verhoudt het zich tot een eindpuntadres?

Een basisadres is het hoofdadres voor een ServiceHost klasse. Als u standaard een ServiceMetadataBehavior klasse aan uw serviceconfiguratie toevoegt, wordt de WSDL (Web Services Description Language) voor alle eindpunten die de host publiceert, opgehaald uit het HTTP-basisadres, plus een relatief adres dat wordt geleverd aan het gedrag van de metagegevens, plus '?wsdl'. Als u bekend bent met ASP.NET en IIS, is het basisadres gelijk aan de virtuele map.

Een poort delen tussen een service-eindpunt en een mex-eindpunt met behulp van netTcpBinding

Als u het basisadres voor een service opgeeft als net.tcp://MyServer:8080/MyService en de volgende eindpunten toevoegt:

<services>  
  <service name="Microsoft.Samples.NetTcp.CalculatorService">  
    <endpoint address="calcsvc" binding ="netTcpBinding" contract="Microsoft.Samples.NetTcp.ICalculator"/>  
    <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />  
  </service>  
</services>  

En als u een van de NetTcpBinding-instellingen wijzigt, zoals wordt weergegeven in het volgende configuratiefragment:

<bindings>  
  <netTcpBinding>  
    <binding closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions" hostNameComparisonMode="StrongWildcard" listenBacklog="10" maxBufferPoolSize="524288" maxBufferSize="65536" maxConnections="11" maxReceivedMessageSize="65536">  
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>  
      <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false"/>  
      <security mode="Transport">  
        <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign"/>  
      </security>  
    </binding>  
  </netTcpBinding>  
</bindings>  

Er wordt een fout weergegeven zoals de volgende: Unhandled Exception: System.ServiceModel.AddressAlreadyInUseException: Er is al een listener op IP-eindpunt 0.0.0.0.0:9000 U kunt deze fout omzeilen door een volledig gekwalificeerde URL op te geven met een andere poort voor het MEX-eindpunt, zoals wordt weergegeven in het volgende configuratiefragment:

<services>  
  <service name="Microsoft.Samples.NetTcp.CalculatorService">  
    <endpoint address="calcsvc" binding ="netTcpBinding" contract="Microsoft.Samples.NetTcp.ICalculator"/>  
    <endpoint address="net.tcp://localhost:9001/servicemodelsamples/mex" binding="mexTcpBinding" contract="IMetadataExchange" />  
  </service>  
</services>  

Wanneer u een WCF-web-HTTP-toepassing aanroept vanuit een WCF SOAP-toepassing, retourneert de service de volgende fout: methode 405 Niet toegestaan

Als u een WCF-web-HTTP-toepassing aanroept (een service die gebruikmaakt van de WebHttpBinding en WebHttpBehavior) van een WCF-service, kan de volgende uitzondering worden gegenereerd: Unhandled Exception: System.ServiceModel.FaultException`1[System.ServiceModel.ExceptionDetail]: The remote server returned an unexpected response: (405) Method Not Allowed. deze uitzondering treedt op omdat WCF de uitgaande OperationContext gegevens overschrijft met de binnenkomende OperationContextservice. U kunt dit probleem oplossen door een OperationContextScope in de WCF-web-HTTP-servicebewerking te maken. Bijvoorbeeld:

public string Echo(string input)  
{  
    using (new OperationContextScope(this.InnerChannel))  
    {  
        return base.Channel.Echo(input);  
    }  
}  

Zie ook