由于某种原因,我的AttributeContract对象没有正确地从我的客户端传递到我的服务方法。我可以通过调用成功访问该方法,但该对象为空。我在这里做错了什么建议?
客户端
using (var client = new HttpClient())
{
string serviceCall = string.Format("{0}AttributeService.svc/AttributeDefinition/", _serviceLocation);
int attributeIdInt = Convert.ToInt32(attributeId);
int objectIdInt = Convert.ToInt32(objectId);
AttributeContract attributeContract = new AttributeContract()
{
AttributeId = attributeIdInt,
AttributeValue = attributeValue,
ObjectId = objectIdInt,
ObjectType = objectType
};
string attributeString = JsonConvert.SerializeObject(attributeContract);
string requestJsonString = "{ \"attribute\" : " + attributeString + " }";
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, serviceCall);
request.Content = new StringContent(requestJsonString, Encoding.UTF8, "application/json");
HttpResponseMessage response = client.SendAsync(request).Result;
}
数据合同
[DataContract(Name = "AttributeContract")]
public class AttributeContract
{
[DataMember(Name = "AttributeId")]
public int AttributeId { get; set; }
[DataMember(Name = "Attribute")]
public string Attribute { get; set; }
[DataMember(Name = "AttributeValue")]
public string AttributeValue { get; set; }
[DataMember(Name = "ObjectId")]
public int ObjectId { get; set; }
[DataMember(Name = "ObjectType")]
public string ObjectType { get; set; }
[DataMember(Name = "LastModifiedDate")]
public DateTime LastModifiedDate { get; set; }
[DataMember(Name = "LastModifiedUser")]
public string LastModifiedUser { get; set; }
}
服务合同
[OperationContract]
[WebInvoke(Method = "PUT",
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json,
UriTemplate = "AttributeDefinition/")]
void UpdateAttributes(AttributeContract attribute);
服务方法
[OperationBehavior(TransactionScopeRequired = true)]
public void UpdateAttributes(AttributeContract attribute)
{
attribute.LastModifiedDate = DateTime.Now;
}
答案 0 :(得分:0)
您的方法不匹配:在服务合同上,它被输入为PUT,但在客户端上它是POST。你的对象名称也不匹配:attribute =! AttributeContract
答案 1 :(得分:0)
string serviceCall = string.Format("{0}AttributeService.svc/AttributeDefinition/", _serviceLocation);
int attributeIdInt = Convert.ToInt32(attributeId);
int objectIdInt = Convert.ToInt32(objectId);
AttributeContract attributeContract = new AttributeContract()
{
AttributeId = attributeIdInt,
AttributeValue = attributeValue,
ObjectId = objectIdInt,
ObjectType = objectType
};
var request =
(HttpWebRequest)
WebRequest.Create(new Uri(serviceCall );
request.ContentType = "application/json";
request.Method = "PUT";
var itemToSend = JsonConvert.SerializeObject(
attributeContract
);
using (var streamWriter = new StreamWriter(await request.GetRequestStreamAsync()))
{
streamWriter.Write(itemToSend);
streamWriter.Flush();
streamWriter.Dispose();
}
试试此代码
答案 2 :(得分:0)
原来你不需要JSON中的对象包装器(每个mkysoft)。在fiddler中进行了一些挖掘,发现我在数据合同上反序列化datetime属性时遇到了问题。我将属性从DateTime更改为字符串,同时确定最佳路径。