2010-08-10 18 views
4

Ceci est une suite à Choosing a Connection String based on kind of request pour lequel je n'ai pas eu de réponse et ce que je pensais ne fonctionnait pas.Différencier l'application client et le navigateur dans le service Web ASMX?

Je dispose d'un service Web qui doit choisir une chaîne de connexion spécifique en fonction de l'utilisateur qui l'appelle à partir d'un navigateur ou d'une application cliente.

J'ai essayé:

HttpContext.Current != null? ConnectionStrings["Website"].ConnectionString : ConnectionStrings["Client"].ConnectionString 

mais a réalisé que, à un moment donné, même si j'utilise l'application cliente, il y a un certain HttpContext (si quelqu'un peut expliquer pourquoi il serait génial) mais le champ Browser sous Request est "Unknown". Alors, j'ai essayé:

if (HttpContext.Current != null) 
{ 
    if (HttpContext.Current.Request.Browser != "Unknown") 
    { 
    //browser connection string here 
    } 
    else 
    //client app connection string here 
} 
else 
    //client app connection string here 

Cette merveilles a travaillé lors du débogage, mais sur l'environnement de test, il pointe toujours à la chaîne de connexion du navigateur, même lors de l'appel de l'application cliente, comme si, à un moment donné que le navigateur est « inconnu "...

Existe-t-il une façon BEAUCOUP plus simple/plus facile de faire cela? La façon dont je le fais semble vraiment moche.

Je suis tout à fait désespérée au moment que je ne sais pas pourquoi cela se passe ..

+0

Eh bien, vous devez enregistrer la valeur 'Browser' pendant les tests, et voir ce que c'est réellement. –

+0

Pouvez-vous ajouter plus de détails? Utilisez-vous WCF ou WebMethods? Comment le navigateur accède-t-il à vos services Web? Pas par SOAP, je présume? –

+0

Kirk, j'utilise WebMethods. Je vais essayer cette suggestion Robert. –

Répondre

1

Plutôt que de détecter et de commutation du type de navigateur, pensez à ces deux suggestions:

Ajouter Demande personnalisée En-têtes

Dans vos divers appels, définissez un nouvel en-tête personnalisé dans votre requête Http.

HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url); 
webRequest.Headers.Add("CallerType", "ClientApp"); // "Browser", etc. 

Ensuite, vous savez exactement et de manière fiable quel type de client appelle. Ce serait difficile de se tromper, et ne pourrait pas être usurpé/se méprendre.

inclure le type de l'appelant dans le QueryString

myService.asmx?BrowserType=1 

Ajouter un simple paramètre nouveau querystring à votre .asmx webmethod. Cela fonctionnera de la même manière dans un environnement contrôlé, mais si d'autres utilisateurs/développeurs se trompent ou malforment les valeurs attendues, vous devrez prendre d'autres mesures pour corriger/gérer.

Les deux vous permettent de déterminer facilement le connString sur la valeur entrante. Peut-être l'absence d'un modificateur/en-tête, vous pouvez supposer un défaut. Votre exemple de question a 2 résultats de base, et la solution suggérée sera facile à étendre (navigateur, application client, iPhone, whathaveyou).