我有一个使用Json.NET(newtonsoft)作为自定义序列化程序的工作应用程序.目前我在自定义的WebServiceHostFactory中添加了WebHttpBehavior的衍生物.请参阅本博客末尾的代码段,了解我是如何附加它的.
由于我在IIS中托管此服务,我想摆脱我的自定义托管代码,只需将自定义行为添加到我的web.config.该程序显示在这篇msdn文章中.
所以我试着这样做:
<behaviors>
<endpointBehaviors>
<behavior name="jsonRest">
<webHttp defaultOutgoingResponseFormat="Json" />
<NewtonsoftJsonBehavior/>
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<extensions>
<behaviorExtensions>
<add name="NewtonsoftJsonBehavior" type="Newtonsoft.Json.Extensions.NewtonsoftJsonBehavior, NewtonsoftJsonExtensions, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" />
</behaviorExtensions>
</extensions>
Run Code Online (Sandbox Code Playgroud)
可悲的是,我无法做那项工作.当我这样做时,Visual Studio告诉我
元素'behavior'具有无效的子元素'NewtonsoftJsonBehavior'
在上面提到的msdn文章中,据说是这样的
要向元素添加配置功能,您需要编写和注册配置元素.有关此内容的更多信息,请参阅System.Configuration文档.
定义元素及其配置类型后,可以使用扩展名,如以下示例所示.
我有这种感觉,我所缺少的就是那个.以某种方式注册元素及其配置类型.可悲的是,我无法对System.Configuration做出正面或反面,它应该告诉我如何做到这一点.所以这基本上是我的问题:
如何编写和注册配置元素,如果这不是我的问题,那么问题是什么?
提前谢谢了!
我有一个.NET 4 .exe(Winform桌面应用程序),我添加了一个WCF behaviorExtension.应用程序在本地计算机上加载正常,但在通过网络加载时会抛出SecurityException.如果我省略了setMaxFaultSizeBehavior behaviorExtension,那么我可以通过网络加载应用程序.我将不胜感激任何有助于实现这一目标的信息.我已确认文件未被阻止,并且程序集名称完全匹配,包括空格.
app.config的相关部分看起来像这样(我缩短了类型名称和程序集名称,在实际的配置文件中,我使用完整的命名空间和程序集名称):
<system.serviceModel>
<bindings configSource="bindings.config" />
<client configSource="clients.config" />
<extensions>
<behaviorExtensions>
<add name="setMaxFaultSizeBehavior" type="SetMaxFaultSizeBehavior, BehaviorAssembly, Version=1.8.0.0, Culture=neutral, PublicKeyToken=41b332442f1101cc" />
</behaviorExtensions>
</extensions>
<behaviors>
<endpointBehaviors>
<behavior name="LargeQuotaBehavior">
<dataContractSerializer maxItemsInObjectGraph="2147483600" />
<setMaxFaultSizeBehavior />
</behavior>
</endpointBehaviors>
</behaviors>
Run Code Online (Sandbox Code Playgroud)
通过网络运行时遇到的异常是:
An error occurred creating the configuration section handler for system.serviceModel/behaviors: Request failed. (\\server\Share\app.exe.Config line 22)
Exception Type: System.Configuration.ConfigurationErrorsException
Source: System.Configuration
Run Code Online (Sandbox Code Playgroud)
具有System.Security.SecurityException的内部异常
这真让我抓狂。我有一个扩展,如果出现错误,我们可以用它来更改请求的内容响应。基本上,如果一切正常,它会正常序列化为 JSON,但如果我们收到未处理的异常,我们会根据不同的对象进行序列化。
我们需要围绕此进行单元测试,但我不知道如何编写它们。验证其是否有效的方法围绕 StatusCode、错误消息实例和响应的 ContentType。
为了修改返回的响应,我使用了 WebOperationContext 静态类。我见过嘲笑这个的例子,但似乎我必须硬编码特殊逻辑,然后这些逻辑就会开始渗透到实际代码中,这是我不想要的。
对 WCF 行为扩展进行单元测试的最佳方法有哪些?
我在AfterReceiveRequest中获得了一些值,并希望在WCF中的BeforeSendReply中使用它.请帮助我,我该怎么做.我正在使用C#项目文件.我不能在这里使用Seesion,ViewState.我可以用
静态字段,但它不是一个好的解决方案.请给我最好的解决方案.
以下是我的代码的一些行.
public object AfterReceiveRequest(
ref System.ServiceModel.Channels.Message request,
System.ServiceModel.IClientChannel channel,
System.ServiceModel.InstanceContext instanceContext)
{
ClassABC abc = new ClassABC();
int webServiceID = abc .SetInformation(--//any parameters//--);
return null;
}
public void BeforeSendReply(ref System.ServiceModel.Channels.Message reply,
object correlationState)
{
//here I need webServiceID.
}
Run Code Online (Sandbox Code Playgroud) 我有一个自定义的OperationBehavior.我想立即将它应用于所有操作.遗憾的是,无法在整个服务或web.config中配置OperationBehaviors.
在测试应用程序中托管WCF服务时,我可以执行以下操作:
foreach (var ep in _serviceHost.Description.Endpoints)
{
foreach (OperationDescription od in ep.Contract.Operations)
{
od.Behaviors.Add(new MyOperationBehavior());
}
}
_serviceHost.Open();
Run Code Online (Sandbox Code Playgroud)
但是我如何在IIS托管的Web应用程序中执行此操作?
我试图让OperationContext.Current.Host.Description.Endpoints在Application_Start,但当然OperationContext.Current是不提供任何操作开始前,所以我的方法失败.