gpt4 book ai didi

c# - 以编程方式创建 WCF 客户端

转载 作者:行者123 更新时间:2023-11-30 23:23:50 24 4
gpt4 key购买 nike

我有一个正在运行的 WCF 服务和一个正在工作的客户端,但是目前我已经在我的客户端中引用了该服务。

我想动态创建客户端引用。

这是我的配置文件:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=e77a5e561934e089" requirePermission="false" />
</configSections>
<system.serviceModel>
<services>
<!-- This section is optional with the new configuration model
introduced in .NET Framework 4. -->
<service name="Service.CalculatorService" behaviorConfiguration="CalculatorServiceBehavior">
<host>
<baseAddresses>
<add baseAddress="http://xx.xx.xx.xx:20001/Service/service" />
</baseAddresses>
</host>
<!-- this endpoint is exposed at the base address provided by host: http://xx.xx.xx.xx:20001/Service/service -->
<endpoint address="" binding="wsHttpBinding" contract="Service.IReportData" bindingConfiguration="CustomBinding" />
<!-- the mex endpoint is exposed at http://xx.xx.xx.xx:20001/Service/service/mex -->
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
<bindings>
<wsHttpBinding>
<binding name="CustomBinding" closeTimeout="00:02:00" openTimeout="00:02:00" receiveTimeout="00:10:00" sendTimeout="00:02:00" maxReceivedMessageSize="2147483647">
<security mode="None">
<transport clientCredentialType="None" />
<message establishSecurityContext="false" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="CalculatorServiceBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="True" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
<system.data>
<DbProviderFactories>
<remove invariant="System.Data.SQLite.EF6" />
<add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6" />
</DbProviderFactories>
</system.data>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="v11.0" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
<provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
</providers>
</entityFramework>
</configuration>

我用谷歌搜索了大约一个星期,发现了以下我一直在尝试使用的代码片段,我在 stackoverflow 上找到了它。

我找到它的帖子的链接是:Configure wcf service programmatically

public virtual ChannelFactory<T> Proxy<T>(string address)
{
//Validate Address
if (string.IsNullOrEmpty(address)) throw new ArgumentNullException("Address can not be null or empty.");
//Address
EndpointAddress endpointAddress = new EndpointAddress(address);

//Binding
WSHttpBinding wsHttpBinding = new WSHttpBinding(SecurityMode.None, false);
wsHttpBinding.OpenTimeout = wsHttpBinding.CloseTimeout = new TimeSpan(0, 1, 0);
wsHttpBinding.ReceiveTimeout = wsHttpBinding.SendTimeout = new TimeSpan(0, 10, 0);
wsHttpBinding.MaxReceivedMessageSize = wsHttpBinding.MaxBufferPoolSize = 2147483647;
wsHttpBinding.BypassProxyOnLocal = wsHttpBinding.AllowCookies = wsHttpBinding.TransactionFlow = false;
wsHttpBinding.MessageEncoding = WSMessageEncoding.Text;
wsHttpBinding.TextEncoding = Encoding.UTF8;
wsHttpBinding.UseDefaultWebProxy = true;
wsHttpBinding.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard;
wsHttpBinding.ReaderQuotas = new XmlDictionaryReaderQuotas(); //ReaderQuotas, setting to Max
wsHttpBinding.ReaderQuotas.MaxArrayLength = wsHttpBinding.ReaderQuotas.MaxBytesPerRead = 2147483647;
wsHttpBinding.ReaderQuotas.MaxStringContentLength = wsHttpBinding.ReaderQuotas.MaxNameTableCharCount = 2147483647;
wsHttpBinding.ReaderQuotas.MaxDepth = 2147483647;

//Create the Proxy
ChannelFactory<T> proxy = new ChannelFactory<T>(wsHttpBinding, endpointAddress);

//Sets the MaxItemsInObjectGraph, so that client can receive large objects
foreach (var operation in proxy.Endpoint.Contract.Operations)
{
DataContractSerializerOperationBehavior operationBehavior = operation.Behaviors.Find<DataContractSerializerOperationBehavior>();
//If DataContractSerializerOperationBehavior is not present in the Behavior, then add
if (operationBehavior == null)
{
operationBehavior = new DataContractSerializerOperationBehavior(operation);
operation.Behaviors.Add(operationBehavior);
}
//IMPORTANT: As 'operationBehavior' is a reference, changing anything here will automatically update the value in list, so no need to add this behavior to behaviorlist
operationBehavior.MaxItemsInObjectGraph = 2147483647;
}
return proxy;
}

当我尝试编译时出现两个错误:

Error 1 'Proxy<...>': cannot declare instance members in a static class

Error 3 The type or namespace name 'T' could not be found (are you missing a using directive or an assembly reference?)

为了使用 ChannelFactory 类,我缺少什么?

编辑:

我已将 ChannelFactory 更改为 ChannelFactory,但现在我收到以下错误:

Error 1 'Proxy<...>': cannot declare instance members in a static class

最佳答案

Error   1   'Proxy<...>': cannot declare instance members in a static class

查看此方法所在的类,确保它不是 static .

Error   3   The type or namespace name 'T' could not be found (are you missing a using directive or an assembly reference?)

当您看到像 ChannelFactory<T> 这样的通用类的定义时或 List<T> , T只是实际类型的占位符,例如 List<string>List<DateTime> .通过查看上面的代码,我猜它是 ChannelFactory<IReportData> .


这是一个非常简单的客户端。我使用了在您创建新的 WCF 应用程序项目时创建的示例服务。

public class MyServiceClient : ClientBase<IService>, IService
{
public string GetData(int value)
{
return base.Channel.GetData(value);
}

public CompositeType GetDataUsingDataContract(CompositeType composite)
{
return base.Channel.GetDataUsingDataContract(composite);
}
}

来自documentation对于 ChannelFactory :

The generic ChannelFactory class is used in advanced scenarios that require the creation of a channel factory that can be used to create more than one channel.

换句话说,如果您只是想创建一个客户端,那么您可能不需要使用 ChannelFactory .


在实践中,我使用 Castle Windsor WCF Integration Facility创建我的 WCF 客户端。这仅适用于您对使用依赖注入(inject)和使用 CaSTLe Windsor 感兴趣的情况。我强烈建议学习使用它,因为依赖注入(inject)是一种有用的做法。但除此之外,您还可以方便地使用它来创建和处理您的客户。

结果是您的类永远不会“知道”WCF 服务。他们只知道他们正在使用 IReportData .他们不知道该接口(interface)的实现是 WCF 客户端。在幕后,Windsor 正在创建和配置客户端,在大多数情况下,唯一的配置是一行 <endpoint> app.config 中的元素。

这是 entry page用于他们的文档。

关于c# - 以编程方式创建 WCF 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38113016/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com