【问题标题】:Calling .net web service with complex parameters使用复杂参数调用 .net Web 服务
【发布时间】:2009-09-21 12:13:52
【问题描述】:

我在 asp.net 中看到了许多带有 WCF 的 json Web 服务示例,它们接受一个参数。我需要我的服务方法来接受许多参数并返回这样的列表;

这是我的 Service.svc:

public class Car
{
    public string Title;
    public int Number;
}

[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

public class Service
{

    [OperationContract]
    [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
    public List<Car> GetCarById(int userid, string password , List<Cars> carlist)
    {
        //Doing some stuff here
    }
}

在我的 web.config 中:

<system.serviceModel>
   <behaviors>
       <endpointBehaviors>
             <behavior name="ServiceAspNetAjaxBehavior">
                 <enableWebScript />
             </behavior>
       </endpointBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
   <services>
         <service name="Service">
             <endpoint address="" behaviorConfiguration="ServiceAspNetAjaxBehavior"
 binding="webHttpBinding" contract="Service" />
          </service>
  </services>
  </system.serviceModel>

如果我想传递所有这些参数,我该如何调用这个服务?当我尝试使用参数 userid、password 和 carlist 调用该方法时,它们都为空。这是我在一个名为 Fiddler 的应用程序中使用 POST 发送给http://localhost/Service.svc/GetCarById 的内容:

HEADERS:
Host: localhost
Content-Length: 136
Content-Type: application/json; charset=utf-8

BODY:
{"d":{"password":"test","userid":123,"carlist":[{"__type":"Car","Number":1,"Title":"BMW"},{"__type":"Car","Number":2,"Title":"Honda"}]}}

响应是:{"d":null} 该方法正在返回 carlist,所以我知道该方法被调用并且该 carlist 为空。如果我将方法更改为返回一个字符串,例如“错误”,我会得到它,所以我知道该方法被调用..

你知道我做错了什么吗?

【问题讨论】:

  • 查看您发送的 JSON 肯定会有所帮助,但问题仍然缺少一个关键部分 - 您用来调用的客户端 JavaScript 代码称呼。您确定您的服务方法实际上正在被调用吗?您如何获取您发送的 JSON?
  • 是的,我正在使用 Fiddler 来测试该方法。用一些信息更新了原始问题。啊啊啊,看不出有什么问题!!谢谢你帮助我! :-)
  • 终于搞定了,看最后一个答案..

标签: asp.net web-services json


【解决方案1】:

终于找到解决办法了:

更改自:

[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]

只是:

[WebInvoke]

然后我调用了没有初始“d”的服务,一切正常!

感谢您的帮助!

【讨论】:

    【解决方案2】:

    你能改变你的方法的签名吗?如果是这样,为什么不创建一个封装参数的 Request 对象呢?像这样:

    public class GetCarByIdRequest
    {
       public int CarId {get;set;}
       public int Password {get;set;}
       public List<Car> CarList {get;set;}
    }
    

    【讨论】:

    • 感谢您的帮助!我真正需要做的是将一个列表作为参数发送到我的方法中。但我不知道如何将数据发布到我的方法中。您知道在哪里可以找到有关如何执行此操作的示例吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多