gpt4 book ai didi

wcf - 使用 ServiceRoute 时指定 WCF 绑定(bind)

转载 作者:行者123 更新时间:2023-12-04 13:34:54 24 4
gpt4 key购买 nike

我目前正在使用以下代码注册 WCF 服务:

var factory = new DefaultServiceHostFactory();
RouteTable.Routes.Add(new ServiceRoute("XXXEndPoint", factory, IXXXEndPoint)));

这一切都很好,但是我还需要更改阅读器配额设置的 MaxStringContentLength 属性。似乎使用了默认值 8192,不管我是否尝试更改它,我猜这是来自 DefaultServiceModel?

是否有任何合适的 Hook 来覆盖 DefaultServiceModel 上的此设置,或者我应该派生自己的服务主机/模型类,还是我以错误的方式解决这个问题?

任何建议表示赞赏。

编辑:请注意,绑定(bind)的配置必须以编程方式执行(而不是通过配置文件)。

谢谢

最佳答案

您可以通过扩展主机工厂来实现。
通过对下面的代码稍作修改,您可以将附加参数传递给 WCFServiceHostFactory 以从 Global.asax 进行设置
我使用下面的类始终将其设置为 Int32.MaxValue

//在 Global.asax 中

routes.Add(new ServiceRoute(routePrefix,
new WCFServiceHostFactory(),
serviceType));

//WCFServiceHostFactory.cs
namespace MyServices.MyService
{
public class WCFServiceHostFactory:WebServiceHostFactory
{
protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
WCFServiceHost host = new WCFServiceHost(serviceType, baseAddresses);

return host;
}
}
}

//WCFServiceHost.cs
namespace MyServices.MyService
{
public class WCFServiceHost:WebServiceHost
{
public WCFServiceHost(): base ()
{
}

public WCFServiceHost (object singletonInstance, params Uri [] baseAddresses)
: base (singletonInstance, baseAddresses)
{
}

public WCFServiceHost(Type serviceType, params Uri[] baseAddresses)
: base (serviceType, baseAddresses)
{
}



protected override void OnOpening ()
{
base.OnOpening ();

foreach (Uri baseAddress in BaseAddresses) {
bool found = false;
foreach (ServiceEndpoint se in Description.Endpoints)
if (se.Address.Uri == baseAddress)
{
found = true;
((WebHttpBinding)se.Binding).ReaderQuotas.MaxStringContentLength = Int32.MaxValue;//here you set it and also set it below
}
if (!found) {
if (ImplementedContracts.Count > 1)
throw new InvalidOperationException ("Service '"+ Description.ServiceType.Name + "' implements multiple ServiceContract types, and no endpoints are defined in the configuration file. WebServiceHost can set up default endpoints, but only if the service implements only a single ServiceContract. Either change the service to only implement a single ServiceContract, or else define endpoints for the service explicitly in the configuration file. When more than one contract is implemented, must add base address endpoint manually");
var enumerator = ImplementedContracts.Values.GetEnumerator ();
enumerator.MoveNext ();
Type contractType = enumerator.Current.ContractType;
WebHttpBinding binding = new WebHttpBinding();
binding.ReaderQuotas.MaxStringContentLength = Int32.MaxValue; //here also
AddServiceEndpoint (contractType, binding, baseAddress);
}

}

foreach (ServiceEndpoint se in Description.Endpoints)
if (se.Behaviors.Find<WebHttpBehavior> () == null)
se.Behaviors.Add (new WebHttpBehavior ());

// disable help page.
ServiceDebugBehavior serviceDebugBehavior = Description.Behaviors.Find<ServiceDebugBehavior> ();
if (serviceDebugBehavior != null) {
serviceDebugBehavior.HttpHelpPageEnabled = false;
serviceDebugBehavior.HttpsHelpPageEnabled = false;
}
}
}
}

关于wcf - 使用 ServiceRoute 时指定 WCF 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5087979/

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