簡體   English   中英

將對象發布到json中的wcf rest服務會返回名稱空間錯誤

[英]Post object to a wcf rest service in json returns namespace error

您正在嘗試使用wcf-rest服務將news對象添加到數據庫中:

Guid id;
id = Guid.NewGuid();

var httpWebRequest = (HttpWebRequest)WebRequest.Create("http://localhost:47026/NewsRepository.svc/AddNews");
httpWebRequest.ContentType = "application/json";
httpWebRequest.Method = "PUT";

JsonSerializerSettings microsoftDateFormatSettings = new JsonSerializerSettings
{
    DateFormatHandling = DateFormatHandling.MicrosoftDateFormat
};

string json = JsonConvert.SerializeObject(new
{
    Id = id,
    Subject = "wfwf",
    ViewerCounter = "1",
    Content = "fsdsd",
    SubmitDateTime = "2012/12/12",
    ModifiedDateTime = "2012/12/12",
    PublisherName = "sdaadasd",
    PictureAddress = "adfafsd",
    TypeOfNews = "adsadaad"

}, microsoftDateFormatSettings);
using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
{
    JsonSerializer serializer = new JsonSerializer();
    serializer.Serialize(streamWriter, json);
}
try { 

var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
    var result = streamReader.ReadToEnd();
}
}
catch(Exception er)
{
    MessageBox.Show(er.ToString());
}

但是它返回了錯誤的請求400。因此我在WCF日志中跟蹤了錯誤,發現了這一點:

Expecting state 'Element'.. Encountered 'Text'  with name '', namespace ''. 

這是我的服務代碼:

 [OperationContract]
    [WebInvoke(Method = "PUT", UriTemplate = "/AddNews", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
    bool Add(News entity);

 public class NewsRepository :INewsRepository
    {
        private readonly DataContext _ctx;
        public NewsRepository(DataContext ctx)
        {
            _ctx = ctx;
        }

        public bool Add(News entity)
        {
            try
            {
                _ctx.News.Add(entity);
                _ctx.SaveChanges();
                return true;
            }

還有我的新聞模型

[DataContract]
public class News
{
    [DataMember]

    public Guid Id { set; get; }
    [DataMember]

    public string Subject { set; get; }
    [DataMember]

    public int ViewerCounter { set; get; }
    [DataMember]

    public string MainContent { set; get; }
    [DataMember]

    public DateTime SubmitDateTime { set; get; }
    [DataMember]

    public DateTime ModifiedDateTime { set; get; }
    [DataMember]

    public string PublisherName { set; get; }
    [DataMember]

    public string PictureAddress { set; get; }
    [DataMember]

    public string TypeOfNews { set; get; }//etelaeie ya khabar



}

更改代碼

 Guid id;
            id = Guid.NewGuid();

            var httpWebRequest = (HttpWebRequest)WebRequest.Create("http://localhost:47026/NewsRepository.svc/AddNews");
            httpWebRequest.ContentType = "application/json";
            httpWebRequest.Method = "POST";
            JsonSerializerSettings microsoftDateFormatSettings = new JsonSerializerSettings
            {
                DateFormatHandling = DateFormatHandling.MicrosoftDateFormat
            };

            string json = JsonConvert.SerializeObject(new News()
            {
                Id = id,
                Subject = "wfwf",
                ViewerCounter = 1, // removed the "" (string)
                MainContent = "fsdsd", // renamed from "Content"
                SubmitDateTime = DateTime.Now,
                ModifiedDateTime = DateTime.Now,
                PublisherName = "sdaadasd",
                PictureAddress = "adfafsd",
                TypeOfNews = "adsadaad"
            }, microsoftDateFormatSettings);

            using (StreamWriter streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
            {
                JsonSerializer serializer = new JsonSerializer();
                serializer.Serialize(streamWriter, json);
            }
            try { 
            var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
            using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
            {
                var result = streamReader.ReadToEnd();
            }
            }
            catch(Exception er)
            {
                MessageBox.Show(er.ToString());
            }

但是同樣的錯誤

類型不匹配

目前,您的匿名類型具有以下屬性

public Guid Id { get; set; }
public string Subject { get; set; }
public string ViewerCounter { get; set; }
public string Content { get; set; }
public DateTime SubmitDateTime { get; set; }
public DateTime ModifiedDateTime { get; set; }
public string PublisherName { get; set; }
public string PictureAddress { get; set; }
public string TypeOfNews  { get; set; }

哪個與您預期的News類型不符

public class News
{
    public Guid Id { set; get; }
    public string Subject { set; get; }
    public int ViewerCounter { set; get; }
    public string MainContent { set; get; }
    public DateTime SubmitDateTime { set; get; }
    public DateTime ModifiedDateTime { set; get; }
    public string PublisherName { set; get; }
    public string PictureAddress { set; get; }
    public string TypeOfNews { set; get; }
}

快速解決

string json = JsonConvert.SerializeObject(new
{
    Id = id,
    Subject = "wfwf",
    ViewerCounter = 1, // removed the "" (string)
    MainContent = "fsdsd", // renamed from "Content"
    SubmitDateTime = "2012/12/12",
    ModifiedDateTime = "2012/12/12",
    PublisherName = "sdaadasd",
    PictureAddress = "adfafsd",
    TypeOfNews = "adsadaad"
}, microsoftDateFormatSettings);

建議

為了使您的代碼更易於管理,您應確保盡可能發送相同類型的代碼(在本例中為News )。 目前,您正在向服務發送匿名類型,這可能是導致問題的罪魁禍首...

所以你應該從改變開始

string json = JsonConvert.SerializeObject(new { ... }); // anonymous type

string json = JsonConvert.SerializeObject(new News { ... }); // News type

最終解決方案:

   News student = new News
            {
                Id = Guid.NewGuid(),
                Subject = "wfwf",
                ViewerCounter = 1, // removed the "" (string)
                MainContent = "fsdsd", // renamed from "Content"
                SubmitDateTime = DateTime.Now,
                ModifiedDateTime = DateTime.Now,
                PublisherName = "sdaadasd",
                PictureAddress = "adfafsd",
                TypeOfNews = "adsadaad"
            };
            WebClient Proxy1 = new WebClient();
            Proxy1.Headers["Content-type"] = "application/json";
            MemoryStream ms = new MemoryStream();
            DataContractJsonSerializer serializerToUplaod = new DataContractJsonSerializer(typeof(News));
            serializerToUplaod.WriteObject(ms, student);
             Proxy1.UploadData("http://localhost:47026/NewsRepository.svc/AddNews", "POST", ms.ToArray());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM