Eh bien, vous touchez vraiment sur deux questions distinctes: le service
- disponibilité locale vs service à distance
- "normal" par rapport cams (pour les gros fichiers)
En général, Si votre service fonctionne derrière un pare-feu d'entreprise sur un réseau local, vous devriez utiliser NetTcpBinding car c'est le plus rapide et le plus efficace. C'est rapide et efficace car il utilise l'encodage des messages binaires (vs l'encodage des messages texte sur Internet). Si vous devez fournir un service pour le monde "extérieur", vous devriez essayer d'utiliser une liaison aussi interopérable que possible, et ici vos choix sont basicHttpBinding (totalement interopérable - "vieux" protocoles SOAP 1.1) qui ne peuvent pas être trop sécurisé, et wsHttpBinding qui offre beaucoup plus de flexibilité et d'options, mais est moins largement pris en charge. Comme vous pouvez facilement créer un seul service avec trois points de terminaison, vous pouvez vraiment créer votre service, puis définir ces trois points de terminaison: un pour les clients locaux utilisant NetTcpBinding, l'un des plus larges avec basicHttpBinding et un autre avec wsHttpBinding .
C'est un aspect de l'histoire. L'autre est: pour vos appels de service "normaux", en échangeant quelques informations (jusqu'à quelques Ko), vous devriez utiliser le comportement normal par défaut de "transfert en mémoire tampon" - le message est préparé complètement dans un tampon et envoyé dans son ensemble. Cependant, pour gérer des fichiers volumineux, il est préférable d'utiliser un mode de transfert en continu - soit "StreamedResponse" si vous voulez que les clients puissent télécharger des fichiers depuis votre serveur, soit "StreamedRequest" si vous voulez que les clients soient capable d'uplaod des fichiers, ou tout simplement "Streamed" si vous envoyez des fichiers dans les deux sens. Donc, en plus des trois points d'extrémité "réguliers", vous devez avoir au moins un autre point d'extrémité pour chaque liaison qui gère l'échange de données en continu, c'est-à-dire le téléchargement/téléchargement de fichiers. Cela peut sembler être un grand nombre de points de terminaison différents - mais ce n'est vraiment pas un problème, vos clients peuvent se connecter à n'importe quel point de terminaison (s) approprié pour eux - régulier vs c.-à-d.streamed et interne/local (netTcpBinding) vs externe (basicHttpBinding) comme ils en ont besoin - et à la fin, vous écrivez le code une seule fois!
Ah, la beauté de la WCF! :-)
Marc
MISE À JOUR:
OK, après votre commentaire, voici ce que je ferais:
- créer un contrat de service avec
ILocalService
une seule méthode qui retourne une GetFile
chemin et nom de fichier
- créer une implémentation pour le contrat de service
- hôte ce service sur un point final avec
netTcpBinding
(car il est interne, locale)
[ServiceContract]
interface ILocalService
{
[OperationContract]
string GetFile(......(whatever parameters you need here).....);
}
class LocalService : ILocalService
{
string GetFile(......(whatever parameters you need here).....)
{
// do stuff.....
return fileName;
}
}
et d'autre part:
- créer un second contrat de service
IRemoteService
avec une seule méthode GetFile
qui ne renvoie pas de nom de fichier en tant que chaîne, mais retourne un flux
- créer une implémentation pour le contrat de service
- hôte de ce service sur un terminal avec
basicHttpBinding
pour internet
- assurez-vous d'avoir
transferMode="StreamedResponse"
dans votre configuration de liaison, pour permettre le streaming le fichier sur
[ServiceContract]
interface IRemoteService
{
[OperationContract]
Stream GetFile(......(whatever parameters you need here).....);
}
class RemoteService : IRemoteService
{
Stream GetFile(......(whatever parameters you need here).....)
{
// do stuff.....
FileStream stream = new FileStream(....);
return stream;
}
}
Il semble que vous ayez un service WCF qui vous oblige à écrire sur un système de fichiers local. Vous pouvez toujours utiliser le streaming ou le partage pour envoyer les données du fichier au service. Je ne suis pas ce que vous parlez de cette différence entre local et distant? – RichardOD