我正在尝试使用带有 XML 的 REST 将对象发布到 WCF 服务,但我一直被"error: (400) Bad Request"
抛出。我知道这个网站上有很多关于同样问题的帖子,但我似乎找不到解决方案。
我的 WCF 服务代码:
iPhoneBookService.cs:
[OperationContract]
[WebInvoke( UriTemplate = "/addentry/",
Method = "POST",
BodyStyle = WebMessageBodyStyle.Bare,
RequestFormat = WebMessageFormat.Xml,
ResponseFormat = WebMessageFormat.Xml)]
void AddEntry(Contact contact);
PhoneBookService.cs:
DataPhonebookDataContext dc = new DataPhonebookDataContext();
public void AddEntry(Contact contact)
{
if (contact == null)
{
throw new ArgumentNullException("contact");
}
dc.Contacts.InsertOnSubmit(contact);
try
{
dc.SubmitChanges();
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
客户端(ASP 页)代码:
private WebClient client = new WebClient();
HttpWebRequest req;
protected void Page_Load(object sender, EventArgs e)
{
req = (HttpWebRequest)WebRequest.Create("http://localhost:1853/PhoneBookService.svc/addentry/");
req.Method = "POST";
req.ContentType = "application/xml; charset=utf-8";
req.Timeout = 30000;
client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted);
}
protected void btnAddEntry_Click(object sender, EventArgs e)
{
var contact = new Contact(); //Contact class from WCF service reference
contact.LastName = txtLastName.Text;
contact.FirstName = txtFirstName.Text;
contact.PhoneNumber = txtPhone.Text;
//Code using Webclient
//client.UploadData(new Uri("http://localhost:1853/PhoneBookService.svc/addentry/"), TToByteArray<Contact>(contact));
//Code using webrequest
byte[] buffer = TToByteArray<Contact>(contact);
req.ContentLength = buffer.Length;
Stream PostData = req.GetRequestStream();
PostData.Write(buffer, 0, buffer.Length);
PostData.Close();
HttpWebResponse resp = req.GetResponse() as HttpWebResponse;
Encoding enc = System.Text.Encoding.GetEncoding(1252);
StreamReader loResponseStream =
new StreamReader(resp.GetResponseStream(), enc);
string response = loResponseStream.ReadToEnd();
}
private byte[] TToByteArray<T>(T item)
{
BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
if (!typeof(T).IsSerializable)
{
throw new ArgumentException("The type of the argument must be serializable");
}
bf.Serialize(ms, item);
return ms.ToArray();
}
该类Contact
在 中定义,DataContext
由 LinqToSQL 类生成。我将Contact
类编辑为可序列化的。