syedkhaleel Ответов: 3

Как передать пользовательский объект в службу WCF


Всем Привет,

Я пытаюсь передать сложный объект службе WCF через клиентское приложение.
Когда я отлаживаю код, я вижу, что объект приходит как null.

Я попробовал следующий код.

Метод интерфейса

[OperationContract]
        [WebInvoke(Method = "POST",
            ResponseFormat = WebMessageFormat.Json,
            BodyStyle = WebMessageBodyStyle.WrappedRequest,
            UriTemplate = "Testmethod/JSON/")]
        bool TestmethodJson(Complain comp);


реализация сервиса

public bool TestmethodJson(Complain comp)
        {
            if (comp != null)
            {
             //code goes here  
                return true;
            }
            else
            {
              //code goes here
                return false;
            } 



Код клиентского приложения выглядит следующим образом

static void Main(string[] args)
        {
            Complain comp = new Complain()
            {
                CompainType = "type1",
                CompainBody = "Body1"
            };

             //JavaScriptSerializer serializer = new JavaScriptSerializer();

            string output = JsonConvert.SerializeObject(comp);

            //string output = serializer.Serialize(complain);

             string strUri = "http://localhost:35798/NavGAT.svc/Testmethod/JSON/";
            Uri uri = new Uri(strUri);
            WebRequest request = WebRequest.Create(uri);
            request.Method = "POST";
            request.ContentLength = output.Length;
            request.ContentType = "application/json; charset=utf-8";

          //  JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();
            string serOut = JsonConvert.SerializeObject(comp);
          //  string serOut = jsonSerializer.Serialize(complain);

            using (StreamWriter writer = new StreamWriter(request.GetRequestStream()))
            {
                writer.Write(serOut);
            }

            WebResponse responce = request.GetResponse();
            Stream reader = responce.GetResponseStream();

            StreamReader sReader = new StreamReader(reader);
            string outResult = sReader.ReadToEnd();
            sReader.Close();
        }


Я могу вызвать службу из клиента, но объект приходит как null.Пожалуйста, дайте мне знать о проблеме при прохождении сложного объекта обслуживания.


заранее спасибо.. :)

3 Ответов

Рейтинг:
12

Rajat_RJT

У вас есть BodyStyle как WrappedRequest,поэтому вам нужно сделать-
Либо удалить

BodyStyle = WebMessageBodyStyle.WrappedRequest
или передайте свой объект как
{
    "comp": {
        "ComplainType": "1",
        "ComplainBody": "message"
    }
}

Это, как вы можете видеть значения в объект.


[no name]

тем не менее данные поступают как нулевые..

Rajat_RJT

@syedkhaleel, я обновил свой ответ, это, безусловно, поможет вам.

[no name]

спасибо за то, что нашли время решить эту проблему.

Rajat_RJT

Спасибо @syedkhleel,пожалуйста, отметьте это решение как ответ, если оно вам помогло.

Рейтинг:
1

sreeharijakkala

You have BodyStyle as WrappedRequest,so you need to do-
Either remove
Hide   Copy Code
BodyStyle = WebMessageBodyStyle.WrappedRequest
or pass your object like
Hide   Copy Code
{
    "comp": {
        "ComplainType": "1",
        "ComplainBody": "message"
    }
}


Это решение сработало для меня


CHill60

Затем разместите комментарий против решения с помощью команды "есть вопрос или комментарий?" ссылка. Не просто копируйте решение и перепечатывайте его как свое собственное.
Если участники сочтут это плагиатом, то ваш аккаунт может быть заблокирован. Я советую вам удалить это решение прямо сейчас.

Рейтинг:
0

Murtuza Husain Miyan Patel

Пожалуйста, убедитесь, что у вас есть объявление класса сущности с атрибутом DataContract над ним, а CompainType и CompainBody должны иметь атрибут DataMemeber над ним.

using System.Runtime.Serialization;

 [DataContract]
    public class Complain 
    {
        #region Private Members
        private string _CompainBody ;
        private string _CompainType ;
        #endregion

        #region Public Members

        [DataMember]
        public int CompainBody 
        {
            get { return _CompainBody ; }
            set { _CompainBody = value; }
            }
        [DataMember]
        public string CompainType 
        {
            get { return _CompainType ; }
            set { _CompainType = value; }
        }

        }
}


[no name]

привет,
я объявил свой класс с datacontract и свойства только с атрибутами datamember.

Rajat_RJT

какие данные вы передаете с помощью какого url-адреса?

[no name]

Я скопировал данные жалобы в приведенном выше коде.Пожалуйста, посмотрите на раздел кода "код клиентского приложения идет следующим образом".