2010-03-30 2 views
2

J'ai créé un service WCF (.NET 3.5) qui saisit des données à partir d'un db et renvoie une liste d'objets. Cela fonctionne très bien. Je l'ai testé en utilisant l'application WCFTestClient et obtenu les résultats souhaités.Comment modifier mon service WCF pour qu'il fonctionne avec les pages ASP.NET?

Maintenant, j'ai essayé de créer une application Web ASP.NET et de consommer le service. Après avoir activé <serviceDebug includeExceptionDetailInFaults="true"/> dans le fichier de configuration, le message d'erreur est "Référence d'objet non définie sur une instance d'un objet". Comment puis-je modifier le service pour qu'il fonctionne avec ASP.NET?

Merci!

Mise à jour 1 - J'ai créé une référence au service. Lorsque j'ai exécuté mon application de test très basique, basée sur l'exemple de code affiché sur la page Web par défaut du service, j'ai reçu le message "Référence de l'objet non défini sur une instance d'un objet".

Le service renvoie les résultats corrects lorsque j'utilise l'utilitaire WCF Test Client fourni avec Visual Studio. Lorsque j'essaie d'utiliser le code suivant, le tout dans l'événement page_load, j'obtiens le message de référence d'objet.

PhoneNumberServiceClient client = new PhoneNumberServiceClient(); 

// Use the 'client' variable to call operations on the service 
List<PhoneNumber> phones = client.GetPhoneNumbers(); 

// Always close the client. 
client.Close(); 

Je vais essayer d'obtenir des informations de débogage supplémentaires.

+1

Nous avons besoin d'un peu plus d'informations. Avez-vous ajouté une référence de service à l'application ASP.net? Pouvez-vous ajouter un point d'arrêt du côté du serveur et parcourir votre code pour voir ce qui se passe? – JSmyth

+0

Un service WCF ne nécessite aucune modification pour fonctionner avec des pages ASP.NET. Quelque chose d'autre est faux. Veuillez publier l'exception complète que vous recevez sur le client. Placez un bloc try/catch autour du code et dans le bloc catch, récupérez la valeur de ex.ToString(). Postez ça ici. Aussi, dites ce qui se passe quand 'includeExceptionDetailInFaults' est faux. –

Répondre

0

Avez-vous essayé openning le service après l'initialisation en utilisant:

client.Open(); 

Si le problème persiste encore peut-être le il se trouve sur la méthode WCF elle-même. Essayez d'ajouter des points d'arrêt sur votre méthode et de la déboguer pour identifier la cause de l'erreur.Vous pouvez également utiliser des profileurs.

+0

Enveloppé différentes lignes avec des blocs try-catch pour le débogage. J'ai été en mesure d'ouvrir la connexion, mais aucune donnée n'a été renvoyée par la méthode qui aurait dû renvoyer une liste d'objets. Une enquête plus approfondie a révélé que j'avais un mauvais fichier web.config. – DenaliHardtail

0

Vous devez également configurer le service pour autoriser les détails d'exception dans les résultats. Follow the info in here to make that happen.

Je suppose que votre application ASP.NET s'attend à attraper certaines informations du service que vous ne l'avez pas configuré pour fournir, d'où l'erreur d'objet nul.

+0

a été activé. C'est de là que vient le message de référence de l'objet. Avant d'activer includeExceptionDetailInFaults, j'ai reçu un message générique suggérant que je l'ai activé pour les informations de débogage. Le service renvoie des données, aucune question à ce sujet. J'ai un point d'arrêt sur la méthode afin que je puisse voir ce qui est retourné. – DenaliHardtail

0

Je l'aurais écrit comme commentaire, mais je n'ai pas compris comment, alors je suppose que je vais tenter une réponse.

Vous avez mentionné que vous avez utilisé le client de test intégré, mais lorsque vous avez créé votre application client (le site Web avec lequel vous souhaitez appeler votre nouveau service), avez-vous configuré son point de fin (web.config) de votre service wcf? Par exemple, une application client appelant un service WCF avec point final de wsHttpBinding:

<configuration> 
<system.serviceModel> 
    <client> 
     <endpoint address="http://localhost:8080/ContractorService" binding="wsHttpBinding" contract="ContractorService.IContractorService" 
      name="ContractorService_WsHttp"> 
     </endpoint> 
    </client> 
</system.serviceModel> 

En outre, votre service renvoie une liste, la référence de service par défaut que vous avez ajouté à votre client arrête très probablement à tableau. Cliquez avec le bouton droit de la souris sur la référence de service de votre client et sélectionnez Configurer la référence du service, dans la zone déroulante du type de collection, au lieu de System.array, sélectionnez System.Collections.Generic.List.

Si vous avez besoin de détails sur la configuration, vérifiez ici http://msdn.microsoft.com/en-us/library/dd936243.aspx

Placer un point de rupture dans la méthode Page_Load de votre client, vous devriez être en mesure de parcourir votre code client et il sautera automatiquement dans votre service WCF Une fois que vous appelez sa méthode, vous pouvez voir exactement où elle échoue. Hope this helps

+0

J'ai essayé de changer le type de collection entre liste et tableau. Ne pas aller. J'ai changé tellement de choses à ce stade, je ne peux rien faire pour travailler. Dans la matinée, je vais recommencer et voir ce qu'il se passe. – DenaliHardtail

Questions connexes