0

我想知道创建 WCF-Web 服务时发生的幕后魔术。

在一个旧项目中,我得到了可以从 JavaScript 调用的方法,如下所示

[OperationContract]
[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
IEnumerable<Result> SearchObjects(string x, int y, double z);

这在我从 JavaScript 发送 { "x": "something", "y": 1, "z": 1.5 } 时有效。

在创建该 Web 服务几个月后,我找到了 WCF Web API 并尝试制作类似的东西。

不同之处在于我使用 HttpServiceHostFactory() 在 Global.asax 中创建了路由

现在,当我尝试调用该方法时,我得到了这样的异常

异常详细信息:System.InvalidOperationException:HttpOperationHandlerFactory 无法确定应与服务操作“Invoke_LoginRequest”的请求消息内容相关联的输入参数。如果操作不期望请求消息中的内容,请使用 HTTP GET 方法进行操作。否则,请确保一个输入参数的 IsContentParameter 属性设置为“True”,或者是可分配给以下之一的类型:HttpContent、ObjectContent 1, HttpRequestMessage or HttpRequestMessage1。

为了让它工作,我需要声明这样的方法(VB.Net)

Public Function Invoke_LoginRequest(ByVal request As HttpRequestMessage(Of JsonValue)) As HttpResponseMessage(Of String)

但后来我需要手动解析 JsonValue 。那么旧版本究竟是如何工作的呢?有什么办法可以让我恢复这种行为吗?

最好的问候杰斯珀

4

1 回答 1

0

1)定义一个包含您要接收的数据的类,即

public class Model
{
    public string x { get; set; }
    public int y { get; set; }
    public double z { get; set; }
}

2) 将操作参数定义为ObjectContent<Model>

public HttpResponseMessage Post(ObjectContent<Model> c){
    Model m = c.ReadAs();
    ...
}

HTH佩德罗

于 2011-10-28T23:13:41.263 回答