[英]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.