2009-07-01 6 views
0

J'ai un service Web qui fonctionne sur IIS (6 ou 7, peu importe) et je voudrais savoir le port que l'appelant a envoyé leur demande/invocation.Comment trouver le numéro de port de l'appelant d'un service Web dans ASP.NET?

Donc, si un client fait un appel sur mon service Web, comment puis-je savoir du côté du serveur de quel numéro de port l'appel a-t-il été fait?

Est-ce que c'est quelque chose qui passe même au plus bas niveau? Juste pour être clair, je ne cherche pas le port à des fins de rappel. C'est pour la journalisation seulement.

+1

Qu'essayez-vous d'accomplir? –

Répondre

0

Vous devriez pouvoir le trouver comme "REMOTE_PORT" dans les variables de serveur de l'objet Serveur. Cependant, ce port doit toujours être aléatoire et n'est actif que pour la paire Demande/Réponse que le client est en train de créer. Il ne devrait pas être utilisé pour les rappels asynchrones. Même votre service Web lors de l'appel à un autre service utilisera un numéro de port aléatoire pour lancer la demande. Le seul port statique de la communication est le port de réception à l'extrémité serveur de la connexion TCP.

+0

Pouvez-vous élaborer? Parlez-vous de System.Web.HttpServerUtility qui fait partie de l'objet HttpContext et de la propriété Server? Comment obtenez-vous cette valeur? –

+0

no. ServerVariables fait partie de l'objet de requête. Voir http://msdn.microsoft.com/fr-fr/library/system.web.httprequest.servervariables(VS.71).aspx –

0

Si vous service est sur WCF, puis:

OperationContext context = OperationContext.Current; 

MessageProperties messageProperties = context.IncomingMessageProperties; 

var endpointProperty = messageProperties[RemoteEndpointMessageProperty.Name] 
         as RemoteEndpointMessageProperty; 
if (endpointProperty != null) 
{ 
    string sRemoteAddress = endpointProperty.Address; 
    int nRemotePort = endpointProperty.Port; 
} 
+0

Vous recherchez également une solution pour les services qui ne sont pas sur WCF. –

0

sockets TCP ont le concept de numéro de port de l'expéditeur, mais il n'a pas beaucoup utilisé dans des protocoles de niveau d'application. Cela dit, compte tenu du dernier paragraphe du PO, je pense que vous cherchez un moyen de rappeler le client. Les ports que j'ai dit précédemment ne peuvent pas être utilisés pour cela. Les requêtes asynchrones sont identiques aux requêtes synchrones s'exécutant sur un thread séparé, rien de spécial à leur sujet.

+0

Ne cherche pas à faire un rappel du tout. Je veux juste connaître le port du client appelant. Bon point sur l'asynch et le fil, tout se passe du côté client. –

+0

Voir ma réponse: le numéro de port et l'adresse IP que vous obtiendrez n'auront aucun sens dans certaines circonstances. Peut-être le saviez-vous et savez-vous que vous n'êtes pas dans cette situation? Alors s'il vous plaît dites-le. –

+0

@John: et même si le client n'est pas derrière NAT, le numéro de port n'est pas très significatif. –

0

Certains périphériques de type traduction d'adresse réseau masqueront le numéro de port «envoi» réel de votre part. Vous auriez alors accès à une adresse IP inutile et à un numéro de port inutile.

Questions connexes