I am writing a MonoTouch app for iPhone and i am getting the following exception when calling a WCF web service.
Parameter array length does not match the number of message body parts at System.ServiceModel.Dispatcher.WebMessageFormatter+WebClientMessageFormatter.SerializeRequest (System.ServiceModel.Channels.MessageVersion messageVersion, System.Object[] parameters) [0x0003e] in /Developer/MonoTouch/Source/mono/mcs/class/System.ServiceModel.Web/System.ServiceModel.Dispatcher/WebMessageFormatter.cs:310
at System.ServiceModel.Description.WebHttpBehavior+ClientPairFormatter.SerializeRequest (System.ServiceModel.Channels.MessageVersion messageVersion, System.Object[] parameters) [0x00000] in /Developer/MonoTouch/Source/mono/mcs/class/System.ServiceModel.Web/System.ServiceModel.Description/WebHttpBehavior.cs:142
at System.ServiceModel.MonoInternal.ClientRuntimeChannel.CreateRequest (System.ServiceModel.Dispatcher.ClientOperation op, System.Object[] parameters) [0x0001e] in /Developer/MonoTouch/Source/mono/mcs/class/System.ServiceModel/System.ServiceModel/ClientRuntimeChannel.cs:611
at System.ServiceModel.MonoInternal.ClientRuntimeChannel.Request (System.ServiceModel.Description.OperationDescription od, System.Object[] parameters) [0x0002d] in /Developer/MonoTouch/Source/mono/mcs/class/System.ServiceModel/System.ServiceModel/ClientRuntimeChannel.cs:512
at System.ServiceModel.MonoInternal.ClientRuntimeChannel.DoProcess (System.Reflection.MethodBase method, System.String operationName, System.Object[] parameters) [0x00038] in /Developer/MonoTouch/Source/mono/mcs/class/System.ServiceModel/System.ServiceModel/ClientRuntimeChannel.cs:482
at System.ServiceModel.MonoInternal.ClientRuntimeChannel.Process (System.Reflection.MethodBase method, System.String operationName, System.Object[] parameters) [0x00000] in /Developer/MonoTouch/Source/mono/mcs/class/System.ServiceModel/System.ServiceModel/ClientRuntimeChannel.cs:462
I am calling the service with the following methods (Some namespaces have been removed for readability):
public void Begin ()
{
try
{
WebHttpBinding bnd = new WebHttpBinding (WebHttpSecurityMode.Transport);
bnd.MaxBufferSize=2147483647;
bnd.MaxReceivedMessageSize=2147483647;
EndpointAddress addr = new EndpointAddress (new Uri(this.Url));
ServiceClient service = new ServiceClient (bnd, addr);
service.Endpoint.Behaviors.Add(new WebHttpBehavior());
Login login = new Login()
{
InstitutionId=this.InstitutionNumber.ToString ("D4"),
CompanyNumber = (int)this.CompanyId,
Password = this.Password,
UserName = this.Username
};
LoginRequest loginRequest = new LoginRequest{} (GetClientLoginData(), login);
service.LoginCompleted += HandleServiceLoginCompleted;
service.LoginAsync(loginRequest);
}
catch (Exception e)
{
if(failed != null)
{
failed(new ErrorInformation(e));
}
}
}
void HandleServiceLoginCompleted (object sender, LoginCompletedEventArgs e)
{
if(e.Cancelled)
{
if (failed != null)
{
failed (new ErrorInformation ("Request was cancelled"));
}
}
else if(e.Error != null)
{
if (failed != null)
{
failed (new ErrorInformation (e.Error));
}
}
else
{
ServiceClient service = sender as ServiceClient;
LoginResponse response = e.Result;
if (response.LoginResult)
{
if (success != null)
success ();
}
else
{
if (failed != null)
failed (new ErrorInformation (response.errmsg));
}
}
}
When I run this e.Error in HandleServiceLoginCompleted is not null (it is the above exception). I ran wireshark and no packets are sent to the server at all. The service works correctly when called by other means (such as ASP.NET web pages.) I generated the service reference using silverlight’s slsvcutil.exe.
Set
bnd.ReaderQuotas.MaxArrayLength = int.MaxValueThere are also some other limits that you can increase in ReaderQuotas.