我如何从MVC3 Razor Controller调用webservice?

时间:2013-06-15 13:44:32

标签: asp.net-mvc asp.net-mvc-3 web-services

在我的项目中,我需要从控制器调用Web服务。我已经完成了以下工作,但它确实有效。

  1. 将Web服务的Web引用添加到项目中。

  2. 按如下方式调用服务:

    Service Wservice=new Service();
    Wservice.loginCompleted+=new Wservice_login_Completed;
    WService.login_Async("username","Password");
    

    注意:每当我调用此服务时,它都会抛出错误 “此时无法启动异步操作。 异步操作只能在异步处理程序中启动 或模块或在页面生命周期中的某些事件期间。如果这 执行页面时发生异常,确保标记页面 <%@ Page Async =“true”%>。“

  3. 为了克服这个问题,我使用

     [Httppost]
     public ActionResult login(logmodel model)
     {
       Task.Factory.StartNew(() => 
        { 
        Wservice.loginCompleted+=new Wservice_login_Completed;
        WService.login_Async("username","Password");
        });
    
        if(finalresult==true)
        {
          *** return View();
        }
      }
    
      void Wservice_login_completed()
      {
          Here i got the output.
      }
    

    但是Wservice_login_completed()函数的调用是在View ***被返回之后,所以我没有得到结果。我如何实现“从Controller调用web服务”..任何想法?

3 个答案:

答案 0 :(得分:2)

最后,我成功地从MVC Controller调用了web服务。

注意:添加ServiceReference而不是WebReference并避免使用          “Task.Factory.StartNew(()=&GT);”过程

  [Httppost]
 public ActionResult login(logmodel model)
 {
    Wservice.ServiceSoapClient _host = new Wservice.ServiceSoapClient("ServiceSoap");

    var result_out = _host.login(uname, pwd, "test1", "test2", "test3", "test4");
 }

此处“ServiceSoap”是我们服务的端点。您可以在app.confiq或web.config文件中显示端点。 快乐的编码...!

答案 1 :(得分:0)

  1. 获取以下NuGet:

    microsoft http client   
    (id = Microsoft.Net.Http)
    
  2. 创建Web API控制器(webapi_Controller_Name)
    您的Post函数应类似于以下函数
    将此功能放入Web Api控制器

    [HttpPost]  
    public void PostForm(objUser ws_Obj)  
    {   
        // put you code here
    }
    
  3. 按照以下方式从常规Controller调用Web服务。 这是一个异步调用,Web服务将立即返回。

    //call the web service, Asynch        
    HttpClient client = new HttpClient();    
    client.BaseAddress = new Uri("52323/");    
    client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
    client.PostAsJsonAsync("//52323/api/webapi_Controller_Name/PostForm", objContact);
    

答案 2 :(得分:0)

首先,通过右键单击解决方案资源管理器中的项目名称来创建服务引用,然后将鼠标悬停在"添加"选项并单击"服务参考..."

其次,将您的网络服务地址粘贴到"地址" "添加服务参考"的字段页面,一定要添加"?wsdl"在您的网络服务地址的末尾或它不能工作,然后按" Go"。您将看到Web服务出现在"服务"区域。单击该服务以查看将出现在" Operations"中的服务。部分。如果需要,请重命名服务,然后按“确定”创建服务。

最后,将以下代码放入MVC Controller中。将代码放在Get或Post控制器中,这没关系。

    // Declare the Request object.
    ServiceReference1.GetSurveyRequest myGSRq = new ServiceReference1.GetSurveyRequest();

    // You can set the webservice parameters here like...
    myGSRq.Address = getUserData[0].address;
    myGSRq.City = getUserData[0].city;
    myGSRq.State = getUserData[0].state;

    // Now declare the Response object.
    ServiceReference1.GetSurveyResponse myGSR = new ServiceReference1.GetSurveyResponse();

    //And then use the following to process the request and response.
    ServiceReference1.EMPortTypeClient emptc = new ServiceReference1.EMPortTypeClient();
    myGSR = emptc.GetSurvey(myGSRq);

    // In this example the response Object comes back with a URL used to redirect the user 
    //after the webservice has been processed.
    if (myGSR.Url != null)
        Response.Redirect(myGSR.Url.ToString());
    else
        Response.Write("Error");
    return null;

非常简单,希望这有帮助!

如果您正在创建新服务并且可以选择使用Web服务或Web API,我建议您使用Web API。 Build RESTful API's with ASP.NET Web API