Question

I'm new and having problem to implement communication with windows application and website WCF web service. It's keep on showing error and I've tried many times. Hope someone can please help me~~

Website

IApiService.cs

[ServiceContract]
public interface IApiService
{
    [OperationContract]
    [WebInvoke(Method = "POST",
          BodyStyle = WebMessageBodyStyle.Wrapped,
          ResponseFormat = WebMessageFormat.Json)]
    Boolean TestConnection();

    [OperationContract]  
    [WebInvoke(Method = "POST",
          BodyStyle = WebMessageBodyStyle.Wrapped,
          ResponseFormat = WebMessageFormat.Json)]
    Boolean IsPhoneNumberListMatch(int pa, int pb);

    [OperationContract]
    [WebInvoke(Method = "POST",
          BodyStyle = WebMessageBodyStyle.Wrapped,
          ResponseFormat = WebMessageFormat.Json)]
    List<ClientPhoneModel> GetAllPhoneNumber(string pa);

    [OperationContract]
    [WebInvoke(Method = "POST",
          BodyStyle = WebMessageBodyStyle.Wrapped,
          ResponseFormat = WebMessageFormat.Json)]
    List<ClientRegistrationModel> GetAllNewRegistration(string pa);
}

web.config

<system.serviceModel>
    <behaviors>
        <endpointBehaviors>
        <behavior name="EndBehavior">
            <webHttp />
        </behavior>
    </endpointBehaviors>
    <serviceBehaviors>
        <behavior name="ServiceBehavior">
            <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
            <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
    </serviceBehaviors>
    </behaviors>
    <services>
        <service behaviorConfiguration="ServiceBehavior" name="ApiService">
            <endpoint address="basic" binding="webHttpBinding" contract="IApiService" behaviorConfiguration="EndBehavior"/>
        </service>
        <service behaviorConfiguration="ServiceBehavior" name="WebService">
            <endpoint address="" binding="webHttpBinding" contract="IWebService" behaviorConfiguration="EndBehavior"/>
        </service>
    </services>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>
</system.serviceModel>

Window Application

Added localhost:5151/ApiService.svc as Service Reference

Index.cs

try {
    Localhost.ApiServiceClient client = new Localhost.ApiServiceClient();
    client.TestConnection();
}
catch(Exception ex) {
    Log.Exception(ex);
}

App.config

<system.serviceModel>
    <behaviors>
        <serviceBehaviors>
                <behavior name="ServiceBehavior">
                    <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
                    <serviceDebug includeExceptionDetailInFaults="true"/>
                </behavior>
        </serviceBehaviors>
        <endpointBehaviors>
            <behavior name="EndBehavior">
                <webHttp/>
            </behavior>
        </endpointBehaviors>
    </behaviors>
    <client>
        <endpoint address="http://localhost:5151/ApiService.svc" behaviorConfiguration="EndBehavior" binding="webHttpBinding" contract="Localhost.IApiService" name="ApiServiceClient" />
    </client>
</system.serviceModel>

The latest error I could get is

Message : 
    Operation 'IsPhoneNumberListMatch' of contract 'IApiService' specifies multiple request body parameters to be serialized without any wrapper elements. At most one body parameter can be serialized without wrapper elements. Either remove the extra body parameters or set the BodyStyle property on the WebGetAttribute/WebInvokeAttribute to Wrapped.
Stack trace :
    at System.ServiceModel.Description.WebHttpBehavior.TryGetNonMessageParameterType(MessageDescription message, OperationDescription declaringOperation, Boolean isRequest, Type& type)
    at System.ServiceModel.Description.WebHttpBehavior.ValidateBodyStyle(OperationDescription operation, Boolean request)
    at System.ServiceModel.Description.WebHttpBehavior.<>c__DisplayClass7.<>c__DisplayClassa.<GetRequestClientFormatter>b__4()
    at System.ServiceModel.Description.WebHttpBehavior.<>c__DisplayClass7.<GetRequestClientFormatter>b__3()
    at System.ServiceModel.Description.WebHttpBehavior.HideReplyMessage(OperationDescription operationDescription, Effect effect)
    at System.ServiceModel.Description.WebHttpBehavior.GetRequestClientFormatter(OperationDescription operationDescription, ServiceEndpoint endpoint)
    at System.ServiceModel.Description.WebHttpBehavior.ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
    at System.ServiceModel.Description.DispatcherBuilder.ApplyClientBehavior(ServiceEndpoint serviceEndpoint, ClientRuntime clientRuntime)
    at System.ServiceModel.Description.DispatcherBuilder.BuildProxyBehavior(ServiceEndpoint serviceEndpoint, BindingParameterCollection& parameters)
    at System.ServiceModel.Channels.ServiceChannelFactory.BuildChannelFactory(ServiceEndpoint serviceEndpoint, Boolean useActiveAutoClose)
    at System.ServiceModel.ChannelFactory.CreateFactory()
    at System.ServiceModel.ChannelFactory.OnOpening()
    at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
    at System.ServiceModel.ChannelFactory.EnsureOpened()
    at System.ServiceModel.ChannelFactory`1.CreateChannel(EndpointAddress address, Uri via)
    at System.ServiceModel.ChannelFactory`1.CreateChannel()
    at System.ServiceModel.ClientBase`1.CreateChannel()
    at System.ServiceModel.ClientBase`1.CreateChannelInternal()
    at System.ServiceModel.ClientBase`1.get_Channel()
    at LoonTeleShopClient.Localhost.ApiServiceClient.TestConnection() in c:\Users\Kelvin\Documents\Visual Studio 2012\Projects\LoonTeleShopClient\LoonTeleShopClient\Service References\Localhost\Reference.cs:line 339
    at LoonTeleShopClient.Index..ctor() in c:\Users\Kelvin\Documents\Visual Studio 2012\Projects\LoonTeleShopClient\LoonTeleShopClient\Index.cs:line 44

Please help me~~~ million thanks

Was it helpful?

Solution

This may not be the answer you wanted, but I suggest not having multiple parameters on your operations when having to provide a non-soap binding. The primary reason for this is that by only using the "Bare" bodyStyle, you can get a nice help-page. Try setting:

<behaviors>
  <endpointBehaviors>
    <behavior name="EndBehavior">
      <webHttp automaticFormatSelectionEnabled="true" defaultBodyStyle="Bare" helpEnabled="true"/>
    </behavior>
  </endpointBehaviors>
</behaviors>

This will:

  1. Let the user decide if they want to communicate using json or xml
    (automaticFormatSelectionEnabled)
  2. Set a default BodyStyle
  3. Enable the help page

If you do this, you can delete all your WebInvoke attributes: [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)]

You can find the help-page at: http://your.domain/servicename/endpointAddress/help So if I have a service called Engine.svc at service.motor.car and my endpoint address is "v1/web" I would find my help-page at http://service.motor.car/Engine.svc/v1/web/help

Hope this helps :-)

Best regards db

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top