如何在MVC中使用Web服务?

时间:2011-08-15 10:35:41

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

我是MVC的新手(事实上,这是我的第一个任务)

因此,我在本地计算机上运行了一个良好的Web服务,功能正常

http://www.codetrials.local/wcf/UserServices.svc?wsdl

并且在我的MVC应用程序中,我像往常一样添加了一个服务引用,然后在我的Model.cs中我尝试了这个:

 using (CodeTrials.UserServicesClient _client = new UserServicesClient())
  {
       UserWebsite = _client.GetUserWebsite(username);
  }

但是当我尝试运行它时,我总是得到异常endpoint not found。我可以从我的(不同的)asp.net项目访问它,它工作得很好,相同的代码和一切。经过一番挖掘,我发现this answer我将上面的代码修改为:

  BasicHttpBinding binding = new BasicHttpBinding();
  EndpointAddress address = new EndpointAddress("http://www.codetrials.local/wcf/UserServices.svc");
 using (CodeTrials.UserServicesClient _client = new UserServicesClient(binding, address))
  {
       UserWebsite = _client.GetUserWebsite(username);
  }

但现在,我收到了一个新例外:There was no endpoint listening at http://www.codetrials.local/wcf/UserServices.svc?wsdl that could accept the message

所以我在我的智慧结束。

I found a similar question但这不是我想要的。

你能指导我走正确的道路吗? 我做得不对吗? 我应该将Web服务的消耗从模型转移到控制器吗?

感谢。

编辑 - 这是我的配置文件system.serviceModel部分。我只是将它从WCF client test gui tool粘贴到web.config中,因为它不是由visual studio生成的。

<system.serviceModel>
<bindings>
  <basicHttpBinding>
    <binding name="BasicHttpBinding_IUserServices" closeTimeout="00:01:00"
        openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
        allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
        maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
        messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
        useDefaultWebProxy="true">
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
          maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <security mode="None">
        <transport clientCredentialType="None" proxyCredentialType="None"
            realm="" />
        <message clientCredentialType="UserName" algorithmSuite="Default" />
      </security>
    </binding>
  </basicHttpBinding>
</bindings>
<client>
  <endpoint address="http://www.codetrials.local/wcf/UserServices.svc/wcf/UserServices.svc"
      binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IUserServices"
      contract="IUserServices" name="BasicHttpBinding_IUserServices" />
</client>
</system.serviceModel>

2 个答案:

答案 0 :(得分:1)

从评论中重新发布,因为它结果是答案。 :)原来,web.debug.config在这种情况下覆盖了web.config。

你确定它在正确的web.config中吗? VS应该在添加服务引用时自动创建它(至少对我来说)。一个问题是普通的MVC应用程序有两个web.config文件,默认情况下在Views文件夹中有第二个。除此之外,我不确定最新情况。

答案 1 :(得分:0)

您的代码显示您正在使用此网址:http://www.codetrials.local/wcf/UserServices.svc来访问服务端点,但您的异常消息显示您实际上正在使用http://www.codetrials.local/wcf/UserServices.svc?wsdl

检查MVC app web.config文件中的serviceModel元素。如果需要在代码中配置WCF客户端,则从web.config文件中删除整个元素,这可能是错误URL的来源。如果您确实要从web.config文件配置WCF,请删除当前代码并使用以下两行创建客户端并调用该服务:

var _client = new UserServicesClient("BasicHttpBinding_IUserServices");
UserWebsite = _client.GetUserWebsite(username);

您的web.config serviceModel元素中存在类似以下内容的内容:

<system.serviceModel>
    <client>
      <endpoint
        name="BasicHttpBinding_IUserServices"
        address="http://www.codetrials.local/wcf/UserServices.svc"
        binding="basicHttpBinding"
        contract="IUserServices" >
      </endpoint>
    </client>
<!-- rest of element snipped -->

最后,你不应该在using语句中包装UserServicesClient实例,因为reasons outlined in this post. WCF是一个狡猾的野兽......

编辑: 根据您的配置更新,您的问题可能是服务URL是:

http://www.codetrials.local/wcf/UserServices.svc/wcf/UserServices.svc

wcf/UserServices.svc似乎是重复的。