我正在尝试在运行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);
}
}
答案 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,你告诉它不要。