标签: wcf-behaviour

自定义行为不会在我的web.config中注册

我有一个使用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做出正面或反面,它应该告诉我如何做到这一点.所以这基本上是我的问题:

如何编写和注册配置元素,如果这不是我的问题,那么问题是什么?

提前谢谢了!

iis wcf configuration-files wcf-behaviour

20
推荐指数
1
解决办法
1万
查看次数

通过网络在app.config中加载具有WCF behaviorExtension的应用程序时出现SecurityException

我有一个.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的内部异常

.net wcf securityexception wcf-behaviour

6
推荐指数
1
解决办法
1623
查看次数

对 WCF 行为扩展进行单元测试

这真让我抓狂。我有一个扩展,如果出现错误,我们可以用它来更改请求的内容响应。基本上,如果一切正常,它会正常序列化为 JSON,但如果我们收到未处理的异常,我们会根据不同的对象进行序列化。

我们需要围绕此进行单元测试,但我不知道如何编写它们。验证其是否有效的方法围绕 StatusCode、错误消息实例和响应的 ContentType。

为了修改返回的响应,我使用了 WebOperationContext 静态类。我见过嘲笑这个的例子,但似乎我必须硬编码特殊逻辑,然后这些逻辑就会开始渗透到实际代码中,这是我不想要的。

对 WCF 行为扩展进行单元测试的最佳方法有哪些?

c# wcf json unit-testing wcf-behaviour

5
推荐指数
1
解决办法
1407
查看次数

WCF挑战(在IDispatchMessageInspector接口的AfterReceiveRequest方法中)

我在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)

wcf wcf-behaviour

4
推荐指数
1
解决办法
1487
查看次数

如何为IIS托管的WCF服务上的所有操作添加OperationBehavior?

我有一个自定义的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.EndpointsApplication_Start,但当然OperationContext.Current是不提供任何操作开始前,所以我的方法失败.

iis wcf operation wcf-behaviour

2
推荐指数
1
解决办法
2530
查看次数