2011-06-13 9 views
13

Acabo de empezar a trabajar en WCF hace un mes. Por favor, perdóneme si le pregunto algo ya respondido. Intento buscar primero pero no encuentro nada.¿Cómo crear un cliente WCF sin configuraciones en el archivo de configuración?

Leí este artículo, Transferencia de archivos WCF: Streaming & Chunking Channel alojado en IIS. Funciona muy bien. Ahora me gusta integrar el código del lado del cliente para ser parte de mi aplicación, que es una DLL que se ejecuta dentro de AutoCAD. Si quiero trabajar con el archivo de configuración, tengo que cambiar acad.exe.config, que no creo que sea una buena idea. Entonces, si es posible, quiero mover todo el código en el archivo de configuración al código.

Aquí es fichero de configuración:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
<system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
      <binding name="BasicHttpBinding_IService" closeTimeout="00:01:00" 
       openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
       allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
       maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
       messageEncoding="Mtom" textEncoding="utf-8" transferMode="Buffered" 
       useDefaultWebProxy="true"> 
       <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
        maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
       <security mode="None"> 
        <transport clientCredentialType="None" proxyCredentialType="None" 
         realm="" /> 
        <message clientCredentialType="UserName" algorithmSuite="Default" /> 
       </security> 
      </binding> 
     </basicHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://10.1.13.15:88/WCFStreamUpload/service.svc/ep1" 
      binding="basicHttpBinding" 
      bindingConfiguration="BasicHttpBinding_IService" 
      contract="MGFileServerClient.IService" 
      name="BasicHttpBinding_IService" /> 
    </client> 
</system.serviceModel> 

¿Me podría ayudar a hacer que este cambio?

+0

porque acad.exe.config se encuentra en C: \ Program Files \ y nuestra empresa tiene una política para limitar el acceso a esta carpeta. – weslleywang

Respuesta

23

Puede realizar toda la configuración desde el código, suponiendo que no necesita la flexibilidad para cambiar esto en el futuro.

Puede leer sobre la configuración del punto final en MSDN. Si bien esto se aplica al servidor, la configuración del punto final y el enlace también se aplican al cliente, es solo que usted usa las clases de manera diferente.

Básicamente, usted quiere hacer algo como:

// Specify a base address for the service 
EndpointAddress endpointAdress = new EndpointAddress("http://10.1.13.15:88/WCFStreamUpload/service.svc/ep1"); 
// Create the binding to be used by the service - you will probably want to configure this a bit more 
BasicHttpBinding binding1 = new BasicHttpBinding(); 
///create the client proxy using the specific endpoint and binding you have created 
YourServiceClient proxy = new YourServiceClient(binding1, endpointAddress); 

Obviamente es probable que desee para configurar la unión con la seguridad, tiempos de espera, etc. lo mismo que su configuración anterior (you can read about the BasicHttpBinding on MSDN), pero esto se debe conseguir que ir en la dirección correcta.

3

Esta es una configuración totalmente basada en código y código de trabajo. No necesita ningún archivo de configuración para el cliente. Pero al menos necesitas un archivo de configuración allí (se puede generar automáticamente, no tienes que pensar en eso). Toda la configuración se realiza aquí en código.

public class ValidatorClass 
{ 
    WSHttpBinding BindingConfig; 
    EndpointIdentity DNSIdentity; 
    Uri URI; 
    ContractDescription ConfDescription; 

    public ValidatorClass() 
    { 
     // In constructor initializing configuration elements by code 
     BindingConfig = ValidatorClass.ConfigBinding(); 
     DNSIdentity = ValidatorClass.ConfigEndPoint(); 
     URI = ValidatorClass.ConfigURI(); 
     ConfDescription = ValidatorClass.ConfigContractDescription(); 
    } 


    public void MainOperation() 
    { 
     var Address = new EndpointAddress(URI, DNSIdentity); 
     var Client = new EvalServiceClient(BindingConfig, Address); 
     Client.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.PeerTrust; 
     Client.Endpoint.Contract = ConfDescription; 
     Client.ClientCredentials.UserName.UserName = "companyUserName"; 
     Client.ClientCredentials.UserName.Password = "companyPassword"; 
     Client.Open(); 

     string CatchData = Client.CallServiceMethod(); 

     Client.Close(); 
    } 



    public static WSHttpBinding ConfigBinding() 
    { 
     // ----- Programmatic definition of the SomeService Binding ----- 
     var wsHttpBinding = new WSHttpBinding(); 

     wsHttpBinding.Name = "BindingName"; 
     wsHttpBinding.CloseTimeout = TimeSpan.FromMinutes(1); 
     wsHttpBinding.OpenTimeout = TimeSpan.FromMinutes(1); 
     wsHttpBinding.ReceiveTimeout = TimeSpan.FromMinutes(10); 
     wsHttpBinding.SendTimeout = TimeSpan.FromMinutes(1); 
     wsHttpBinding.BypassProxyOnLocal = false; 
     wsHttpBinding.TransactionFlow = false; 
     wsHttpBinding.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard; 
     wsHttpBinding.MaxBufferPoolSize = 524288; 
     wsHttpBinding.MaxReceivedMessageSize = 65536; 
     wsHttpBinding.MessageEncoding = WSMessageEncoding.Text; 
     wsHttpBinding.TextEncoding = Encoding.UTF8; 
     wsHttpBinding.UseDefaultWebProxy = true; 
     wsHttpBinding.AllowCookies = false; 

     wsHttpBinding.ReaderQuotas.MaxDepth = 32; 
     wsHttpBinding.ReaderQuotas.MaxArrayLength = 16384; 
     wsHttpBinding.ReaderQuotas.MaxStringContentLength = 8192; 
     wsHttpBinding.ReaderQuotas.MaxBytesPerRead = 4096; 
     wsHttpBinding.ReaderQuotas.MaxNameTableCharCount = 16384; 

     wsHttpBinding.ReliableSession.Ordered = true; 
     wsHttpBinding.ReliableSession.InactivityTimeout = TimeSpan.FromMinutes(10); 
     wsHttpBinding.ReliableSession.Enabled = false; 

     wsHttpBinding.Security.Mode = SecurityMode.Message; 
     wsHttpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate; 
     wsHttpBinding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.None; 
     wsHttpBinding.Security.Transport.Realm = ""; 

     wsHttpBinding.Security.Message.NegotiateServiceCredential = true; 
     wsHttpBinding.Security.Message.ClientCredentialType = MessageCredentialType.UserName; 
     wsHttpBinding.Security.Message.AlgorithmSuite = System.ServiceModel.Security.SecurityAlgorithmSuite.Basic256; 
     // ----------- End Programmatic definition of the SomeServiceServiceBinding -------------- 

     return wsHttpBinding; 

    } 

    public static Uri ConfigURI() 
    { 
     // ----- Programmatic definition of the Service URI configuration ----- 
     Uri URI = new Uri("http://localhost:8732/Design_Time_Addresses/TestWcfServiceLibrary/EvalService/"); 

     return URI; 
    } 

    public static EndpointIdentity ConfigEndPoint() 
    { 
     // ----- Programmatic definition of the Service EndPointIdentitiy configuration ----- 
     EndpointIdentity DNSIdentity = EndpointIdentity.CreateDnsIdentity("tempCert"); 

     return DNSIdentity; 
    } 


    public static ContractDescription ConfigContractDescription() 
    { 
     // ----- Programmatic definition of the Service ContractDescription Binding ----- 
     ContractDescription Contract = ContractDescription.GetContract(typeof(IEvalService), typeof(EvalServiceClient)); 

     return Contract; 
    } 
} 
Cuestiones relacionadas