2009-10-25 6 views
0

Je suis nouveau à WCF et travaille sur un projet où je construis une bibliothèque WCF qui est appelée par un projet Web (ASP.NET 2.03.5/C#).Appel de service Lbrary à partir de Web Project - Que se passe-t-il dans Web.Config?

J'ai quelques choses à faire ici.

1) J'ai fourni un contrat de compliment (IJSON) pour mes contrats SOAP (ISOAP) pour mes méthodes Web JSON. 2) J'ai un contrat, IFileTransferService, qui gère le streaming de fichiers .

Pouvez-vous s'il vous plaît jeter un oeil à mon app.config et les fichiers web.config et me dire s'ils ont l'air correct ou si je reproduis ce qui est dans mon App.Config dans mon web.config inutilement? Si j'utilise une bibliothèque de services, ai-je vraiment besoin de faire des choses deux fois (déclarer des services, des liaisons, etc.)? Cela ressemble-t-il à ?

Aussi, tous les autres commentaires stylistiques/constructifs concernant ce que j'ai dans side system.serviceModel sont toujours appréciés.

Merci pour votre temps.

web.config

<system.serviceModel> 
    <client> 
     <endpoint name="MySOAPAuthEP" 
       address="http://localhost:1241/WebProj/auth.svc/soap" 
       binding="basicHttpBinding" 
       bindingConfiguration="soapWeb" 
       contract="Project.WebAPI.Authentication.ISOAPAuthService" /> 
     <endpoint name="MySOAPTradeEP" 
       address="http://localhost:1241/WebProj/trade.svc/soap" 
       binding="basicHttpBinding" 
       bindingConfiguration="soapWeb" 
       contract="Project.WebAPI.Trade.ISOAPTradeService" /> 
     <endpoint name="MySOAPFileTransferEP" 
       address="http://localhost:1241/WebProj/filetransfer.svc/soap" 
       binding="basicHttpBinding" 
       bindingConfiguration="httpLargeDataStream" 
       contract="Project.WebAPI.FileTransfer.ISOAPFileTransferService" /> 

     <endpoint name="MyJSONAuthEP" 
       binding="webHttpBinding" 
       bindingConfiguration="jsonWeb" 
       contract="Project.WebAPI.Authentication.IJSONAuthService" /> 
     <endpoint name="MyJSONTradeEP" 
       binding="webHttpBinding" 
       bindingConfiguration="jsonWeb" 
       contract="Project.WebAPI.Trade.IJSONTradeService" /> 
     <endpoint name="MyJSONFileTransferEP" 
       binding="webHttpBinding" 
       bindingConfiguration="jsonWeb" 
       contract="Project.WebAPI.FileTransfer.IJSONFileTransferService" /> 
    </client> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="soapWeb" /> 
     <binding name="httpLargeDataStream" closeTimeout="00:01:00" openTimeout="00:01:00" 
      receiveTimeout="00:10:00" sendTimeout="00:01:00" maxBufferSize="65536" 
      maxReceivedMessageSize="2147483647" messageEncoding="Mtom" transferMode="Streamed"> 
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
      maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      <security mode="None"> 
      <transport clientCredentialType="None" /> 
      </security> 
     </binding> 
     </basicHttpBinding> 
     <webHttpBinding> 
     <binding name="jsonWeb" maxBufferSize="1500000" maxBufferPoolSize="1500000" 
      maxReceivedMessageSize="1500000"> 
      <readerQuotas maxDepth="32" maxStringContentLength="656000" maxArrayLength="656000" 
      maxBytesPerRead="656000" maxNameTableCharCount="656000" /> 
     </binding> 
     </webHttpBinding> 
    </bindings> 
    <behaviors> 
     <endpointBehaviors> 
     <behavior name="WebHttpEPBehavior"> 
      <webHttp /> 
     </behavior> 
     <behavior name="BasicHttpEPBehavior" /> 
     </endpointBehaviors> 
     <serviceBehaviors> 
     <behavior name="Default"> 
      <serviceMetadata httpGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> 
    <services> 
     <service behaviorConfiguration="Default" name="Project.WebAPI.Trade.TradeService"> 
     <endpoint address="json" behaviorConfiguration="WebHttpEPBehavior" 
      binding="webHttpBinding" name="MyJSONTradeEP" contract="Project.WebAPI.Trade.IJSONTradeService" /> 
     <endpoint address="soap" binding="basicHttpBinding" name="MySOAPTradeEP" 
      contract="Project.WebAPI.Trade.ISOAPTradeService" /> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://localhost:1243/WebProj/trade.svc" /> 
      </baseAddresses> 
     </host> 
     </service> 
     <service behaviorConfiguration="Default" name="Project.WebAPI.Authentication.AuthService"> 
     <endpoint address="json" behaviorConfiguration="WebHttpEPBehavior" 
      binding="webHttpBinding" name="MyJSONAuthEP" contract="Project.WebAPI.Authentication.IJSONAuthService" /> 
     <endpoint address="soap" binding="basicHttpBinding" name="MySOAPAuthEP" 
      contract="Project.WebAPI.Authentication.ISOAPAuthService" /> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://localhost:1242/WebProj/auth.svc" /> 
      </baseAddresses> 
     </host> 
     </service> 
     <service behaviorConfiguration="Default" name="Project.WebAPI.FileTransfer.FileTransferService"> 

     <endpoint address="json" behaviorConfiguration="WebHttpEPBehavior" 
        binding="webHttpBinding" name="MyJSONFileTransferEP" contract="Project.WebAPI.FileTransfer.IJSONFileTransferService" /> 

     <endpoint address="soap" 
        binding="basicHttpBinding" 
        name="MySOAPFileTransferEP" 
        bindingConfiguration="httpLargeDataStream" 
        contract="Project.WebAPI.FileTransfer.ISOAPFileTransferService" /> 

     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://localhost:1244/WebProj/filetransfer.svc" /> 
      </baseAddresses> 
     </host> 
     </service> 
    </services> 
    </system.serviceModel> 

App.Config

<system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="soapWeb" /> 
     <binding name="httpLargeDataStream" 
       maxReceivedMessageSize="2147483647" 
       closeTimeout="00:01:00" 
       openTimeout="00:01:00" 
       receiveTimeout="00:10:00" 
       sendTimeout="00:01:00" 
       transferMode="Streamed" 
       messageEncoding="Mtom" 
       maxBufferSize="65536"> 
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
       maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      <security mode="None"> 
      <transport clientCredentialType="None"/> 
      </security> 
     </binding> 
     </basicHttpBinding> 
     <webHttpBinding> 
     <binding name="jsonWeb" maxBufferSize="1500000" maxBufferPoolSize="1500000" 
      maxReceivedMessageSize="1500000"> 
      <readerQuotas maxDepth="32" maxStringContentLength="656000" maxArrayLength="656000" 
      maxBytesPerRead="656000" maxNameTableCharCount="656000" /> 
     </binding> 
     </webHttpBinding> 
    </bindings> 
    <services> 
     <service behaviorConfiguration="Default" name="Project.WebAPI.Trade.TradeService"> 
     <endpoint address="json" behaviorConfiguration="WebHttpEPBehavior" 
      binding="webHttpBinding" name="MyJSONTradeEP" contract="Project.WebAPI.Trade.IJSONTradeService" /> 
     <endpoint address="soap" binding="basicHttpBinding" name="MySOAPTradeEP" 
      contract="Project.WebAPI.Trade.ISOAPTradeService" /> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://localhost:1243/WebProj/trade.svc" /> 
      </baseAddresses> 
     </host> 
     </service> 
     <service behaviorConfiguration="Default" name="Project.WebAPI.Authentication.AuthService"> 
     <endpoint address="json" behaviorConfiguration="WebHttpEPBehavior" 
      binding="webHttpBinding" name="MyJSONAuthEP" contract="Project.WebAPI.Authentication.IJSONAuthService" /> 
     <endpoint address="soap" binding="basicHttpBinding" name="MySOAPAuthEP" 
      contract="Project.WebAPI.Authentication.ISOAPAuthService" /> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://localhost:1242/WebProj/auth.svc" /> 
      </baseAddresses> 
     </host> 
     </service> 
     <service behaviorConfiguration="Default" name="Project.WebAPI.FileTransfer.FileTransferService"> 
     <endpoint address="json" behaviorConfiguration="WebHttpEPBehavior" 
        binding="webHttpBinding" name="MyJSONFileTransferEP" contract="Project.WebAPI.FileTransfer.IJSONFileTransferService" /> 

     <endpoint address="soap" binding="basicHttpBinding" name="MySOAPFileTransferEP" 
        contract="Project.WebAPI.FileTransfer.ISOAPFileTransferService" /> 

     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://localhost:1244/WebProj/filetransfer.svc" /> 
      </baseAddresses> 
     </host> 
     </service> 
    </services> 
    <behaviors> 
     <endpointBehaviors> 
     <behavior name="WebHttpEPBehavior"> 
      <webHttp /> 
     </behavior> 
     <behavior name="BasicHttpEPBehavior" /> 
     </endpointBehaviors> 
     <serviceBehaviors> 
     <behavior name="Default"> 
      <serviceMetadata httpGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 

Répondre

0

Plusieurs commentaires pour aider désencombrer vos fichiers de configuration et les rendre plus lisibles:

  • vous avez à la fois la <services> que ainsi que les sections <client> dans votre web.config et app.config. Pourquoi? Ce n'est généralement pas nécessaire - le côté serveur (où votre code serveur s'exécute) a besoin de <services>, tandis que le côté client qui appelle le serveur n'a besoin que de la section <client>
  • il semble que vous ayez utilisé Visual Studio ou svcutil.exe pour créer vos configurations, car votre configuration de liaison répertorie également toutes les valeurs par défaut de liaison (c'est l'énorme pléthore de paramètres que vous avez). Vous pouvez réduire cela pour ne conserver que les paramètres que vous avez réellement modifiés pour votre scénario spécifique, rendant ainsi les configurations beaucoup plus petites et plus faciles à comprendre.
  • Avez-vous vraiment besoin du réglage <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>? Cela fausse fondamentalement le HttpContext dans vos services WCF afin qu'ils ressemblent et se comportent comme les services Web ASMX - avez-vous besoin de cela?
  • ce paramètre ici <serviceDebug includeExceptionDetailInFaults="true" /> pourrait être utile et ok dans un environnement dev/test, mais je recommande de le retirer pour la production
  • êtes-vous auto-hébergement, ou l'hébergement dans IIS? Si vous utilisez IIS pour héberger, l'entrée <baseAddress> définie ne sera pas utilisée; dans un environnement d'hébergement IIS, l'adresse de base est ignorée, car l'emplacement du fichier * .svc (le répertoire virtuel, il réside dans) est votre adresse de base et vous ne pouvez pas passer outre que

C'est à ce sujet à première vue :-)

Marc

+0

Merci Marc.J'ai suivi votre conseil et j'ai juste quitté la section dans mon web.config mais je n'arrive pas à l'exécuter. J'obtiens l'erreur suivante: Service 'AuthService' a zéro point de terminaison d'application (non-infrastructure). Cela peut être dû au fait qu'aucun fichier de configuration n'a été trouvé pour votre application ou qu'aucun élément de service correspondant au nom de service n'a pu être trouvé dans le fichier de configuration ou qu'aucun point de terminaison n'a été défini dans l'élément de service. Je me souviens que j'avais cette erreur quand j'ai commencé et résolu en vidant les services et les liaisons dans Web.config. Des idées? Merci encore. –

+0

Où hébergez-vous votre classe de service? IIS? Ensuite, vous avez besoin du '' dans votre web.config, et de votre '' (mais pas de "services") dans le client app.config qui accède à ce service –

+0

Merci encore. Non, je suis auto-hébergeant pour le développement en ce moment. –