Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Getting return type invalid error while trying to call WCF webservice 4.0

I am trying to write and call WCF web service, below are the details:

Web.config:

<add relativeAddress="FetchData.svc" service="WCF.Services.FetchData" />

<service name="WCF.Services.FetchData">
    <endpoint address="" binding="webHttpBinding" bindingConfiguration="" name="FetchData" contract="WCF.Services.FetchData" />
</service>

FetchData Class (Sample Code):

using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.Web;
using System.Xml;
using Webservices.Services;
using Data = Webservices.Data;
using System.ServiceModel.Web;
using System.IO;
using System.Net;
using System.ServiceModel.Channels;
using System.Web.UI;
using System.Text;


namespace WCF.Services
{    
    [ServiceContract(Namespace = "urn:WCF.Services.FetchData")]
    public class FetchData
    {
        Data.GetConnect mConnect = new Data.GetConnect();
        private Message RetrievePublishedData(String pub, int number)
        {
            String strOutput = String.Empty; 
            if (!String.IsNullOrEmpty(pub))
            {
                Boolean pubURLExists = mConnect.CheckPubUrlExists(pub);

                if (!pubURLExists)
                {
                    WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.NotFound;
                    return WebOperationContext.Current.CreateTextResponse(String.Format("Requested publication '{0}' is not available.", pub), MimeTypes.TextPlain, Encoding.UTF8);
                }
                using (StringWriter sw = new StringWriterEncoding())
                {
                    using (HtmlTextWriter hw = new HtmlTextWriter(sw))
                    {
                        hw.RenderBeginTag(HtmlTextWriterTag.Html);
                        XmlNode publishedData = mConnect.GetPublishedData(pub, number);
                        hw.RenderEndTag();
                    }
                    return WebOperationContext.Current.CreateTextResponse(sw.ToString(),MimeTypes.TextHTML, Encoding.UTF8);
                }
            }
            return WebOperationContext.Current.CreateTextResponse(strOutput, MimeTypes.TextHTML, Encoding.UTF8);
        }
        [OperationContract]
        [WebGet(UriTemplate = "/published/{number}/{*pub=default}")]
        public Message FetchPublished(String pub, int number)
        {
           return RetrievePublishedData(pub, number);
        }
    }
}

Now when I am trying to browse the web service, I am getting below error:

Web Service URL - http://localhost:8082/FetchData.svc

Error: The operation 'FetchPublished' could not be loaded because it has a parameter or return type of type System.ServiceModel.Channels.Message or a type that has MessageContractAttribute and other parameters of different types. When using System.ServiceModel.Channels.Message or types with MessageContractAttribute, the method must not use any other types of parameters.

Edit:

namespace WCFWebServices
{
    [ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]
     [ServiceContract(Namespace = "urn:WCFWebServices.fetchPush")]
        public class FetchData
        {
         [MessageContract]
         public class RetrievePublishedDataInput
         {
             [MessageBodyMember]
             public String pub;
             [MessageBodyMember]
             public String number;
         }
            private Message RetrievePublishedData(RetrievePublishedDataInput input)
            {
                String strOutput = String.Empty;
                String pub = input.pub;
                String number = input.number;
                if (!String.IsNullOrEmpty(pub))
                {
                    Boolean pubURLExists = true;

                    if (!pubURLExists)
                    {
                        WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.NotFound;
                        return WebOperationContext.Current.CreateTextResponse(String.Format("Requested publication '{0}' is not available.", pub), "application/plain; charset=utf-8", Encoding.UTF8);
                    }
                    using (StringWriter sw = new StringWriter())
                    {
                        using (HtmlTextWriter hw = new HtmlTextWriter(sw))
                        {
                            hw.RenderBeginTag(HtmlTextWriterTag.Html);

                            hw.RenderEndTag();
                        }
                        return WebOperationContext.Current.CreateTextResponse(sw.ToString(), "application/html; charset=utf-8", Encoding.UTF8);
                    }
                }
                return WebOperationContext.Current.CreateTextResponse(strOutput, "application/html; charset=utf-8", Encoding.UTF8);
            }
            [OperationContract]
            [WebGet(UriTemplate = "/publishedData/{number}/{pub=default}")]
            public Message FetchPublished(RetrievePublishedDataInput input)
            {
                return RetrievePublishedData(input);
            }
        }      
}
like image 708
Manoj Singh Avatar asked Dec 12 '22 08:12

Manoj Singh


1 Answers

I believe mentioned error is quite self-explaining. According to the MSDN, using Message class has its own restrictions:

You can use the Message class as an input parameter of an operation, the return value of an operation, or both. If Message is used anywhere in an operation, the following restrictions apply:

  • The operation cannot have any out or ref parameters.
  • There cannot be more than one input parameter. If the parameter is present, it must be either Message or a message contract type.
  • The return type must be either void, Message, or a message contract type.

In case of your contract, the second restriction is violated. The easiest workaround is to create proper MessageContract:

[MessageContract]
public class RetrievePublishedDataInput
{
  [MessageBodyMember] public string Pub;
  [MessageBodyMember] public int Number;
}

private Message RetrievePublishedData(RetrievePublishedDataInput input)
{
    ....
}
like image 115
Konrad Kokosa Avatar answered May 14 '23 05:05

Konrad Kokosa