REST と XML を使用してオブジェクトを 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
クラスをシリアライズ可能に編集しました。