WCF,MVC2,获取对自动生成的WSDL的访问权并处理未找到的默认端点问题

时间:2011-05-03 00:09:14

标签: wcf visual-studio-2010 asp.net-mvc-2 wsdl

我正在尝试在运行MVC2应用程序的同一IIS7网站上运行一个非常基本的Web服务。这提出了几个不同的问题,我认为它与我的system.serviceModel有关,但显然我不确定(或者我会解决它)。 在服务器端,我可以正常运行我的服务,帮助操作就像一个魅力。我可以执行默认的WCF操作GetData并通过FireFox地址栏提供一个值。

http://localhost/services/service1/getdata?value=3(示例)

我遇到的第一个问题是,当我导航到基本服务URI时,它将显示以下消息。虽然这不是世界末日,因为我仍然可以通过操纵地址来执行代码;我确实希望显示其他东西。我希望标准的新Web服务消息通过将“?wsdl”附加到您将收到自动生成的WSDL的地址来解释。我无法访问自动生成的WSDL。

  

“未找到端点。请看看   用于构建的服务帮助页面   对服务的有效请求。“

问题二是关于连接到我的Web服务的客户端应用程序。我在单独的Visual Studio解决方案中创建了一个控制台应用程序,并向Service1添加了一个Web服务引用。在Visual Studio工具中,我可以看到并使用我的服务中存在的两种方法,但是当我运行代码时,我得到以下异常。

  

InvalidOperationException 无法   找到默认端点元素   参考合同   'ServiceReference1.IService1'中   ServiceModel客户端配置   部分。这可能是因为没有   找到了您的配置文件   应用程序,或因为没有端点   匹配此合同的元素可以   可以在客户端元素中找到。

在我发布我的代码之前(我确信读者已经厌倦了阅读我的挣扎)我想提一下,我已经能够在同一个解决方案中完美地运行WCF服务库和控制台应用程序。似乎很少有资源解释WCF,WCF配置和使用MVC。我已经阅读了几篇文章,要么它们已经过时,要么它们太简单了,几乎无用(例如点击按钮接收名为“Service1”的Web服务)。

总结;为什么我无法访问自动生成的WSDL,如何成功连接我的客户端并使用Web服务?现在最好的部分;代码。

Global.asax中

    //Services section
    routes.Add(new ServiceRoute("services/service1", new WebServiceHostFactory(), typeof(Service1)));

的Web.Config

  <system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>
      <standardEndpoints>
        <webHttpEndpoint>
          <standardEndpoint name="DefaultEndpoint" helpEnabled="true" automaticFormatSelectionEnabled="true" />
        </webHttpEndpoint>
        <mexEndpoint />
    </standardEndpoints>
    <services>
      <service name="Project.Services.Service1" behaviorConfiguration="MetadataBehavior">
        <!-- Service Endpoints -->
        <!-- Unless fully qualified, address is relative to base address supplied above -->
        <endpoint endpointConfiguration="DefaultEndpoint" kind="webHttpEndpoint" binding="webHttpBinding" contract="Project.Services.IService1" />
        <!-- Metadata Endpoints -->
        <!-- The Metadata Exchange endpoint is used by the service to describe itself to clients. -->
        <!-- This endpoint does not use a secure binding and should be secured or removed before deployment -->
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MetadataBehavior">
          <!-- To avoid disclosing metadata information, 
          set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="false" /> <!-- httpGetEnabled="true" does not solve the problem either -->
          <!-- To receive exception details in faults for debugging purposes, 
          set the value below to true.  Set to false before deployment 
          to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="True"  />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

IService1

[ServiceContract]
public interface IService1
{
    [OperationContract]
    [WebInvoke(Method = "GET")]
    string GetData(int value);

    [OperationContract]
    CompositeType GetDataUsingDataContract(CompositeType composite);

    // TODO: Add your service operations here
}

服务1

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class Service1 : IService1
{

    public string GetData(int value)
    {
        return string.Format("You entered: {0}", value);
    }

    public CompositeType GetDataUsingDataContract(CompositeType composite)
    {
        if (composite == null)
        {
            throw new ArgumentNullException("composite");
        }
        if (composite.BoolValue)
        {
            composite.StringValue += "Suffix";
        }
        return composite;
    }
}

客户计划

class Program
{
    static void Main(string[] args) {
        Service1Client client = new Service1Client();
        client.GetData(2);
    }
}

2 个答案:

答案 0 :(得分:2)

感谢您的帮助!问题出在我的Global.asax.cs中。

<强>原始

routes.Add(new ServiceRoute("services/service1", new WebServiceHostFactory(), typeof(Service1)));

routes.Add(new ServiceRoute("services/service1", new ServiceHostFactory(), typeof(Service1)));

区别在于主机工厂从“WebServiceHostFactory”到“ServiceHostFactory”。

关于客户端连接的问题的第二部分是因为没有生成配置设置。我必须为每个客户端手动输入它们。糟糕!

为避免手动输入客户端配置,我必须更改我的端点

<强>原始

<endpoint endpointConfiguration="DefaultEndpoint" kind="webHttpEndpoint" binding="webHttpBinding" contract="Project.Services.IService1" /> 

<endpoint binding="wsHttpBinding" contract="Project.Services.IService1" />

在进行此更改后,服务和客户端正在完美运行。

答案 1 :(得分:0)

快速回答您的一个问题:

  

总结;为什么我不能   访问自动生成的WSDL

<serviceMetadata httpGetEnabled="false" />

......需要

<serviceMetadata httpGetEnabled="true" />

...以便能够通过http检索WSDL。 You have to tell WCF to generate service metadata,你告诉它不要。