【发布时间】:2011-11-10 21:23:12
【问题描述】:
我已关注this video series on WCF 并让演示工作。它涉及构建一个管理学生评估表的 WCF 服务,并实施 CRUD 操作以对这些评估列表进行操作。我已经根据this guide 稍微修改了我的代码,因此它将 JSON 结果返回给浏览器或 Fiddler 请求。我的目标是通过在 Fiddler 中构建我自己的请求来弄清楚如何使用该服务,然后使用该格式从移动设备上的应用程序中使用该服务。
我在使用 Fiddler 的 SubmitEval 方法(保存评估)时遇到问题。调用有效,但 Eval 的所有字段均为空(或默认),但 Id 除外,它是在服务本身中设置的。
这是我的Eval 声明(使用属性而不是this question 中的字段):
[DataContract]
public class Eval //Models an evaluation
{
[DataMember]
public string Id { get; set; }
[DataMember]
public string Submitter { get; set; }
[DataMember]
public string Comment { get; set; }
[DataMember]
public DateTime TimeSubmitted { get; set; }
}
这里是IEvalService的相关部分:
[ServiceContract]
public interface IEvalService
{
...
[OperationContract]
[WebInvoke(RequestFormat=WebMessageFormat.Json,
ResponseFormat=WebMessageFormat.Json, UriTemplate = "eval")]
void SubmitEval(Eval eval);
}
还有EvalService:
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
class EvalService : IEvalService
{
...
public void SubmitEval(Eval eval)
{
eval.Id = Guid.NewGuid().ToString();
Console.WriteLine("Received eval");
evals.Add(eval);
}
}
在 Fiddler 的请求生成器中,我将方法设置为 POST,并将地址设置为 http://localhost:49444/EvalServiceSite/Eval.svc/eval。我将标题 Content-Type: application/json; charset=utf-8 添加到默认标题中。请求正文是:
{"eval":{"Comment":"testComment222","Id":"doesntMatter",
"Submitter":"Tom","TimeSubmitted":"11/10/2011 4:00 PM"}}
发送该请求得到的响应是200,但是当我查看已保存的评估时,我刚刚添加的评估具有有效的Id,但Comment 和Submitter 是均为空,TimeSubmitted 为 1/1/0001 12:00:00 AM。
似乎 WCF 正在获取请求,但没有正确反序列化对象。但如果是这样的话,我不知道为什么它没有抛出某种异常。看起来我做得对,还是我错过了什么?
更新:这是 App.config 中的端点声明:
<endpoint binding="webHttpBinding" behaviorConfiguration="webHttp"
contract="EvalServiceLibrary.IEvalService" />
以及端点行为所指:
<behavior name="webHttp">
<webHttp defaultOutgoingResponseFormat="Json"/>
</behavior>
【问题讨论】: