如何从MVC5项目向Rest WCF Service传递参数

问题描述 投票:1回答:1

我有一个WCF Rest服务(使用Json)获取用户名和密码并返回客户信息。这是Method接口。

   //Get Customer by Name
    [OperationContract]
    [WebInvoke
       (UriTemplate = "/GetCustomerByName",
        Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped,
        ResponseFormat = WebMessageFormat.Json,
        RequestFormat = WebMessageFormat.Json
        )]
    List<Model.Customer> GetCustomerByName(Model.CustomerName CustomerData);

我需要在MVC5中调用此方法并将参数传递给它。不知道如何传递参数。

这就是我调用服务的方式:

readonly string customerServiceUri = "http://localhost:63674/CSA.svc/";
 public ActionResult SearchByName(InputData model)
    {
        List<CustomerModel> customerModel = new List<CustomerModel>();

        if (ModelState.IsValid)
        {
            if (model != null)
            {
                using (WebClient webclient = new WebClient())
                {
                    string jsonStr = webclient.DownloadString(string.Format("{0}GetCustomerByName?CustomerData={1}", customerServiceUri, model));

                    if (!string.IsNullOrWhiteSpace(jsonStr))
                    {
                        var result = JsonConvert.DeserializeObject<Models.CustomerModel.Result>(jsonStr);

                        if (result != null)
                        {
                            customerModel = result.GetCustomersByNameResult;
                        }
                    }
                }
            }
        }
        return View(customerModel);
    }

我在这一行上遇到错误:

 string jsonStr = webclient.DownloadString(string.Format("{0}GetCustomerByName?CustomerData={1}", customerServiceUri, model));

这是错误:

远程服务器返回错误:(405)方法不允许。

这是InputData类:

 public class InputData
  {

      public string First_Name { get; set; }
      public string Last_Name { get; set; }
  }
c# asp.net-mvc wcf rest asp.net-mvc-5
1个回答
1
投票

问题是代码行调用服务是错误的。因为您传递了url中的值,所以代码行正在生成GET请求,而不是POST。如果你愿意做POST请求请follow this answer

代码有什么问题?

string jsonStr = webclient.DownloadString(string.Format("{0}GetCustomerByName?CustomerData={1}", customerServiceUri, model));

1)这个错误被抛出(405) Method Not Allowed because you expecting因为POST请求是预期的并且被做成GET请求。

2)这将输出如下内容:http://localhost:63674/CSA.svc/GetCustomerByName?CustomerData=[SolutionName].[ProjectName].InputData

发生这种情况是因为C#不知道如何以你想要的方式将InputData转换为字符串,为此你必须覆盖方法ToString()

可能解决方案

尝试制作一个GET请求,你必须以这种方式调用服务(几乎没有修改)

string jsonStr = webclient.DownloadString(string.Format("{0}GetCustomerByName?firstName={1}&lastName={2}", customerServiceUri, model.First_Name, model.Last_Name));

您必须修改服务以匹配我为GET请求所做的示例。

//Get Customer by Name
[OperationContract]
[WebGet(UriTemplate = "GetCustomerByName?firstName={firstName}&lastName={lastName}")]
List<Model.Customer> GetCustomerByName(string firstName, string lastName);
© www.soinside.com 2019 - 2024. All rights reserved.