I experience this issue:
I have a WCF service, that exposes this operation contract:
[OperationContract]
void Index(int[] song, string fileName);
On my client, I have:
AudioDetectionServiceReference.AudioDetectionServiceClient client = new AudioDetectionServiceReference.AudioDetectionServiceClient();
client.Index(max.ToArray(), mp3Files[i]);
Where max is an array of 2000 int values, and mp3Files[i] is a string of 200 chars.
Web.config has this:
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
<serviceMetadata httpGetEnabled="true"/>
<!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>
And app.config has:
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IAudioDetectionService" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:15863/AudioDetectionService.svc"
binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IAudioDetectionService"
contract="AudioDetectionServiceReference.IAudioDetectionService"
name="BasicHttpBinding_IAudioDetectionService" />
</client>
</system.serviceModel>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>
Now comes the tricky part:
When you right click on service reference, go to configure service reference, there is an option called Collection type. If I set the collection type to “Syste.Array” I get the error
The remote server returned an unexpected response: (400) Bad Request.
With the stack trace:
Server stack trace:
at System.ServiceModel.Channels.HttpChannelUtilities.ValidateRequestReplyResponse(HttpWebRequest request, HttpWebResponse response, HttpChannelFactory factory, WebException responseException, ChannelBinding channelBinding)
at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
at System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)
Exception rethrown at [0]:
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at SqlTest.AudioDetectionServiceReference.IAudioDetectionService.Index(Int32[] song, String fileName)
at SqlTest.AudioDetectionServiceReference.AudioDetectionServiceClient.Index(Int32[] song, String fileName) in blablabla\Service References\AudioDetectionServiceReference\Reference.cs:line 53
at SqlTest.Program.Main(String[] args) in blablabla\Program.cs:line 46
When I change it to “System.Collection.Generic.List”, the error magically disappears.
My question is : WHY?
Second question:
Why does this work?
client.Index(max.Take(100).ToArray(), mp3Files[i]);
using the same context (app.config, web.config, and the same code as above, with the System.Array selected).
Thanks,
Andrei Neagu
PS: I post this because I spent 2 days on trying to change settings for bindings, change the message size, change values from readerQuotas and other stuff, when all I had to do what this stupid selection. So I am quite pissed and I wanna at least learn something from this.
After some more digging, this is what I changed:
app.config
and for the server, look at the fact that there is no name for the basicHttpBinding section. I think that if this section has a name, the default service generated by WCF will ignore it.
And for the other values, I added an 0 at the end (multiplied by 10). Increasing them I think will let you transfer event more. But the most important, the basicHttpBinding has no name. If it had a name, I think it was ignored.
I will not set this as answered, because the question was why System.Array throws exception and System.Generic.List does not.