WCF:未收到消息(数组长度?)

时间:2013-09-11 15:23:57

标签: c# arrays json wcf

我有一个WCF服务,其方法接受一个数组(类型为Frame)。数组中的每个元素都包含一小部分元素(Shape类型),其中每个元素都有两个属性。所以,一切正常。但是现在我有一条从客户端到服务器的消息,它包含一个28帧的数组。有了Wireshark,我看到,消息传输正确。但在我的.NET WCF服务中,我没有接到电话。但为什么?绑定和读取器配额设置为5MB,这应该足够了。

绑定配置:

    <bindings>
        <webHttpBinding>
            <binding name="default" transferMode="Streamed" maxReceivedMessageSize="5000000" maxBufferSize="5000000" maxBufferPoolSize="5000000">
                <readerQuotas maxStringContentLength="5000000" maxArrayLength="5000000" />
            </binding>
        </webHttpBinding>
    </bindings>

WCF服务定义:

[ServiceContract]
public interface IEditor
{
    [OperationContract]
    [WebInvoke(Method = "POST", UriTemplate = "/WriteFrames", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
    void WriteFrames(Frame[] frames, int animationSpeed);
}

类型说明:

  1. 类型:框架
    • 数组:形状
      • Shape 1
      • 形状2
      • ...
  2. 类型:形状
    • 数组:积分
      • 第1点
      • 第2点
      • ...
  3. 类型:点
    • X
    • ý
  4. 该服务作为单身人士托管。请参阅静态创建方法。

    sealed class EditorHost : ServiceHost
    {
        public EditorHost()
            : base(typeof(Editor))
        {
        }
    
        public EditorHost(params Uri[] baseAddresses)
            : base(typeof(Editor), baseAddresses)
        {
        }
    
        public EditorHost(Editor singleton, params Uri[] baseAddresses)
            : base(singleton, baseAddresses)
        {
        }
    
        internal static EditorHost Create(out Editor editor, int port = 8732)
        {
            var uri = new Uri(string.Format("http://localhost:{0}/", port));
            editor = new Editor();
            var host = new EditorHost(editor, uri);
            return host;
        }
    }
    

1 个答案:

答案 0 :(得分:0)

我在this post中发现了问题。我的绑定配置是正确的,但它未正确应用于我的端点。使用端点上的属性bindingConfiguration工作。

我使用来自Colasoft的网络嗅探器发现问题,然后告诉我该软件包最后说的“太长了”。因此,JSON内容被破坏(中断)并且未正确反序列化。我只是想知道.NET没有抛出任何异常。

        <webHttpBinding>
            <binding name="webDefault" transferMode="Streamed" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" maxBufferPoolSize="2147483647">
                <readerQuotas
                    maxStringContentLength="2147483647"
                    maxArrayLength="2147483647"
                     maxDepth="2147483647"
                     maxBytesPerRead="2147483647"
                     maxNameTableCharCount="2147483647"
                    />
            </binding>
        </webHttpBinding>

        <service name="WebService.EditorService.Editor" behaviorConfiguration="BehConfig">
            <endpoint address="/JSON" binding="webHttpBinding" bindingConfiguration="webDefault" contract="WebService.EditorService.IEditor" behaviorConfiguration="web" />
        </service>