Asp.net mvc 如何从MVC3 Razor Controller调用webservice?

Asp.net mvc 如何从MVC3 Razor Controller调用webservice?,asp.net-mvc,asp.net-mvc-3,web-services,Asp.net Mvc,Asp.net Mvc 3,Web Services,在我的项目中,我需要从控制器调用web服务。我已经做了下面的工作,它是有效的 将web服务的web引用添加到项目中 按如下方式呼叫服务: Service Wservice=new Service(); Wservice.loginCompleted+=new Wservice_login_Completed; WService.login_Async("username","Password"); 注意:每当我调用此服务时,它都会抛出一个错误 “此时无法启动异步操作。 异步操作只能在异步处理程

在我的项目中,我需要从控制器调用web服务。我已经做了下面的工作,它是有效的

  • 将web服务的web引用添加到项目中

  • 按如下方式呼叫服务:

    Service Wservice=new Service();
    Wservice.loginCompleted+=new Wservice_login_Completed;
    WService.login_Async("username","Password");
    
    注意:每当我调用此服务时,它都会抛出一个错误 “此时无法启动异步操作。 异步操作只能在异步处理程序中启动 或在页面生命周期中的某些事件期间。如果 执行页面时发生异常,请确保已标记该页面 "

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

     [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()函数是在返回视图***之后,所以我没有得到结果。如何实现“从控制器调用webservice”。。有什么想法吗

    最后,我成功地从MVC控制器调用了webservice

    注意:添加ServiceReference而不是WebReference,并避免
    “Task.Factory.StartNew(()=>);”进程。

      [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文件中显示端点。 快乐编码

  • 获取以下NuGet:

    microsoft http client   
    (id = Microsoft.Net.Http)
    
  • 创建Web API控制器(webapi\u控制器\u名称)
    您的Post功能应类似于以下功能
    将此函数放在Web Api控制器中

    [HttpPost]  
    public void PostForm(objUser ws_Obj)  
    {   
        // put you code here
    }
    
  • 从常规控制器调用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);
    

  • 首先,在解决方案资源管理器中右键单击项目名称,创建服务引用,然后将鼠标悬停在“添加”选项上,然后单击“服务引用…”

    第二,将您的web服务地址粘贴到“添加服务引用”页面的“地址”字段中,确保将“?wsdl”添加到web服务地址的末尾,否则它将不起作用,然后按“Go”。您将看到web服务出现在“服务”区域中。单击服务以查看将出现在“操作”部分的可用服务。如果需要,请重命名该服务,然后按“确定”创建该服务

    最后,将以下代码放入MVC控制器中。将代码放在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;
    
    很简单,希望这有帮助

    如果您正在创建一个新服务,并且可以选择使用webservice或WebAPI,我建议您使用WebAPI。

    你在使用
    AsyncController
    ?我的直觉是这与页面呈现周期有关,你能从浏览器web开发工具发布HTTP请求吗?我也怀疑你是否真的处于异步模式。为什么你使用web引用而不是服务引用?这是传统的“ASMX”技术的一部分,不应该在新代码中使用。@JohnSaunders-当你说为什么要使用web引用而不是服务引用时,你能解释一下你到底想建议什么吗?@PankajGarg:我建议使用服务引用我对格式表示歉意,但编辑非常挑剔,我为澄清的步骤编号。