12
votes

Un contrat de service WCF peut-il avoir un paramètre d'entrée nullable?

J'ai un contrat défini comme celui-ci:

[OperationContract]
[WebGet(UriTemplate = "/GetX?myStr={myStr}&myX={myX}", BodyStyle = WebMessageBodyStyle.Wrapped)]
string GetX(string myStr, int? myX);


0 commentaires

4 Réponses :


1
votes

Oui, vous pouvez avoir des paramètres nullables avec WCF. Je pense que votre problème ici est que QueryStringConverter ne fonctionne pas avec des paramètres nullables.

Que faire? Avez-vous besoin d'utiliser l'attribut Uritemplate? Si vous avez publié cela comme un «service Web classique», vous n'auriez pas ce problème.

L'autre option consiste à suivre l'aviction dans le lien que vous avez fourni - c'est-à-dire recevoir le paramètre myx en tant que chaîne, puis le jeter à un int?, où (par exemple) "n" est null. Pas jolie.


0 commentaires

8
votes

En réalité ... vous pouvez absolument avoir des paramètres nullables, ou tout autre type de paramètre qui n'est pas pris en charge par QueryStringConverter hors de la boîte. Tout ce que vous avez à faire est d'étendre QueryStringConverter pour prendre en charge tout type dont vous auriez besoin. Voir la réponse acceptée dans ce post ==>

Dans le modèle de programmation Web de la WCF, comment écrire un contrat d'opération avec un tableau de paramètres de chaîne de requête (c'est-à-dire avec le même nom)?


1 commentaires

Il y a un bug dans la référence de code ci-dessus que les classes dérivées de QueryStringConverter inutilisables dans Framework 4. Assurez-vous de regarder le bogue avant d'essayer ceci. J'ai perdu beaucoup de temps avant de découvrir que cela ne fonctionne pas dans la pratique.



34
votes

Il existe une solution à ce problème qui ne nécessite aucun piratage. Cela pourrait ressembler à beaucoup de travail, mais ce n'est pas vraiment et fait beaucoup de sens si vous le lisez. Le noyau du problème est qu'il y a en effet un Bug non résolu (à partir de .NET 4) qui signifie que le WebServiceHost fort> n'utilise pas de queryStringconverters personnalisé. Donc, vous avez besoin d'un peu de travail supplémentaire et de comprendre comment fonctionne la configuration WCF de WebhttpendPoints. La ci-dessous définit la solution pour vous.

Premier, une personnalisation QueryStringConverter Strong> qui permet à NULLS d'être fournie dans la chaîne de requête en les omettant ou en fournissant une chaîne vierge: p>

<%@ ServiceHost Service="MyNamespace..Service1" CodeBehind="Service1.svc.cs" Factory="MyNamespace.NullableWebServiceHostFactory" %>


5 commentaires

J'aime cette solution.


C'est un enfer de beaucoup de travail pour quelque chose qui aurait dû être Nobraining à mettre en œuvre par Microsoft.


Quelle surprise, Microsoft fait quelque chose qui devrait être facile dans quelque chose de douloureusement compliqué ... bonne réponse cependant


J'ai créé une bibliothèque et ajouté ces 4 fichiers de classe et a renvoyé tous les espaces de noms respectifs, et a également donné référence à la référence de la DLL LIB à l'application WCFService, mais toujours la même erreur indique que je manque.


Wow. Merci beaucoup pour cette solution. Ne pensait pas que cela peut être aussi bizarre



2
votes

hum, la solution rapide (pas jolie) consiste à accepter le paramètre nullable en tant que chaîne dans l'interface et les codes de service respectifs du WCF.


0 commentaires