无法添加服务。可能无法访问服务元数据。确保您的服务正在运行并公开元数据

时间:2011-03-04 21:35:22

标签: web-services wcf

编辑:

我修改了web.config之后我没有得到错误的错误....然后我添加一个新页面(html)并编写这个小代码来使用这样的服务:

 $("#btn12").click(function (event) {
                $.getJSON('http://localhost:3576/MyService.svc/GetCurrentUser', {},
                function (data) {
                    alert(data);
                });
                //return false;
            });

我在FireBug中看到以下错误:

http://localhost:3576/MyService.svc/GetCurrentUser
400 Bad Request

注意:我在同一个wcf项目中添加了html页面并自行运行项目,所以我假设服务也在运行...

这里可能有什么问题?

结束编辑

我刚创建了一个新的wcf服务,当我从VS点击f5时,我在WCF测试客户端窗口中收到此错误:

  

无法添加服务。可能无法访问服务元数据。确保您的服务正在运行并公开元数据。

     

错误:无法从http://localhost:3696/MobileService.svc获取元数据如果这是您有权访问的Windows(R)Communication Foundation服务,请检查您是否已在指定地址启用元数据发布。有关启用元数据发布的帮助,请参阅http://go.microsoft.com/fwlink/?LinkId=65455上的MSDN文档。

     

WS-Metadata Exchange错误
  URI:http://localhost:3696/MyService.svc
  元数据包含无法解析的引用:“http://localhost:3696/MyService.svc”。

     

http://localhost:3696/MyService.svc没有可以接受该消息的端点。这通常是由错误的地址或SOAP操作引起的。有关更多详细信息,请参阅InnerException(如果存在)。

     

无法连接到远程服务器
  由于目标机器主动拒绝它,因此无法建立连接127.0.0.1:3696
  HTTP GET错误
  URI:http://localhost:3696/MyService.svc
  下载“http://localhost:3696/MyService.svc”时出错   无法连接到远程服务器
  无法建立连接,因为目标计算机主动拒绝它127.0.0.1:3696

我的配置:

<behaviors>
    <endpointBehaviors>
        <behavior name="MyService.MyService">
            <webHttp/>
        </behavior>
    </endpointBehaviors>
    <serviceBehaviors>
        <behavior name="metadataBehavior">
            <serviceMetadata httpGetEnabled="true" httpGetUrl="http://localhost:2812/MyService.svc" />
        </behavior>
    </serviceBehaviors>
</behaviors>
<services>
    <service name="MyService.MyService" 
             behaviorConfiguration="metadataBehavior">
        <endpoint 
            address="http://localhost/MyService.svc" 
            binding="customBinding"
            bindingConfiguration="jsonpBinding" 
            behaviorConfiguration="MyService.MyService"
            contract="MyService.IMyService"/>
    </service>
</services>
<bindings>
    <customBinding>
        <binding name="jsonpBinding">
            <jsonpMessageEncoding/>
            <httpTransport manualAddressing="true"/>
        </binding>
    </customBinding>
</bindings>
<extensions>
    <bindingElementExtensions>
        <add name="jsonpMessageEncoding" type="Microsoft.Ajax.Samples.JsonpBindingExtension, MyService, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
    </bindingElementExtensions>
</extensions>

16 个答案:

答案 0 :(得分:35)

您需要向服务添加元数据交换(mex)端点:

<services>
   <service name="MyService.MyService" behaviorConfiguration="metadataBehavior">
      <endpoint 
          address="http://localhost/MyService.svc" 
          binding="customBinding" bindingConfiguration="jsonpBinding" 
          behaviorConfiguration="MyService.MyService"
          contract="MyService.IMyService"/>
      <endpoint 
          address="mex" 
          binding="mexHttpBinding" 
          contract="IMetadataExchange"/>
   </service>
</services>

现在,您应该能够获取服务的元数据

更新:确定,所以你只是从Visual Studio中启动它 - 在这种情况下,它将托管在内置的Web服务器Cassini中。然而,那只只支持的野兽支持HTTP - 你没有在绑定中使用该协议...

此外,由于您在Cassini中托管此服务,因此您的服务地址将由Cassini决定 - 您无法定义任何内容。

所以我的建议是:

  • 尝试使用http绑定(刚刚进行测试)
  • 让这个工作
  • 一旦知道它可行,将其更改为自定义绑定并将其托管在IIS

所以我将配置更改为:

<behaviors>
   <serviceBehaviors>
      <behavior name="metadataBehavior">
         <serviceMetadata httpGetEnabled="true" />
      </behavior>
   </serviceBehaviors>
</behaviors>
<services>
   <service name="MyService.MyService" behaviorConfiguration="metadataBehavior">
      <endpoint 
          address=""   <!-- don't put anything here - Cassini will determine address -->
          binding="basicHttpBinding" 
          contract="MyService.IMyService"/>
      <endpoint 
          address="mex" 
          binding="mexHttpBinding" 
          contract="IMetadataExchange"/>
   </service>
</services>

完成后,尝试在Visual Studio解决方案中对SVC文件执行View in Browser - 如果这不起作用,则仍然存在某种主要问题。

如果有效 - 现在您可以在VS中按F5并且您的服务应该出现,并且使用WCF Test Client app,您应该能够从a)Cassini开始服务的地址获取您的服务元数据,或b)mex地址(卡西尼号地址+ /mex

答案 1 :(得分:15)

如果您重命名svc文件,请确保您的标记正确无误。 您无需修改​​默认配置并按照以下步骤操作 1)右键单击转到SVC文件,然后选择查看标记 2)确保后面的代码和服务指向更正文件和类名。

答案 2 :(得分:6)

仅供参考 - 您也可以从没有足够内存的计算机上获取此错误。我在运行16 GB内存的计算机上出现此错误。我有一个运行6个演出的VM和很多内存密集型应用程序。关闭一些,这个问题就消失了。

我仍然在

问题的标题中得到错误

无法添加服务。可能无法访问服务元数据。确保您的服务正在运行并公开元数据。

虽然在使用WCF测试客户端时确实注意到有关内存的更大消息。

希望这有助于其他人。

答案 3 :(得分:3)

在您公开的类型

之前添加Serializable()
Serializable()
Public Class YourType

Serializable放入<>

答案 4 :(得分:2)

如果使用.NET 4.0 WCF服务 - 请确保Global.asax不在源目录中。如果是,则在运行时拾取并尝试在...中编译。

答案 5 :(得分:2)

在端点标记中将绑定类型从wsHttpbinding更改为basichttp绑定,从元数据端点标记中的wsHttpbinding更改为mexhttpbinginding,有助于克服错误。谢谢......

答案 6 :(得分:2)

对我来说,通过执行以下操作解决了问题:

导航到工具 --> 选项 --> 项目和解决方案 --> 网络项目

我发现第一个复选框“使用 64 位版本的网站和项目的 IIS Express”未选中。

选中此复选框有助于我启动 WCF 客户端。

VS 版本:VS2019

答案 7 :(得分:1)

就我而言,在评论

<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> 
web.config文件中的

抛出“无法添加服务。可能无法访问服务元数据。请确保您的服务正在运行并公开元数据”。

答案 8 :(得分:0)

我尝试了几种在网络上提到的解决方案,遗憾的是没有任何成功。 在我的项目中,我为每个服务都有两个接口(xml / json)。添加mex端点或绑定配置根本没有帮助。 但是,我注意到,只有在运行带有* .svc.cs或* .config文件的项目时才会出现此错误。当我运行带有IService.cs文件的项目(定义了接口)时,添加服务时没有任何错误。这真的很奇怪,我认为结论是Visual Studio 2013中的错误。 我在几台机器上重现了相同的行为(甚至在Windows Server机器上)。 希望这有助于某人。

答案 9 :(得分:0)

大多数情况下,由于内存空间较少,会发生这种情况。首先检查,然后尝试其他一些技巧。

答案 10 :(得分:0)

属性IsOneWay=true在界面的操作合同中可能为true。 删除该属性以消除此错误。

答案 11 :(得分:0)

在我的情况下,Web服务正在使用与项目/服务名称不同的名称来生成程序集。我的前任开发人员致力于解决方案的设置是这样的,我不知道。

它设置为-

  <serviceBehaviors>
    <behavior name="CustomServiceBehavior">
      <serviceAuthorization serviceAuthorizationManagerType="BookingService.KeyAuthorizationManager, BookingService" />
     </behavior>
 </serviceBehaviors>

因此,解决方法是将正确的程序集名称放入serviceAuthorizationManagerType中。程序集名称可以从服务项目的以下路径获取: 右键单击WCF svc项目->选择“属性”->从选项卡列表中选择“应用程序”。在列表中的“程序集名称:”字段中检查该值。这是用于serviceAuthorizationManagerType的assemblyName,不一定是服务名。

  <serviceBehaviors>
    <behavior name="MyCustomServiceBehavior">
      <serviceAuthorization serviceAuthorizationManagerType="BookingService.KeyAuthorizationManager, AssemblyNameFromSvcProperties" />
     </behavior>
 </serviceBehaviors>

请记住遵循https://docs.microsoft.com/en-us/dotnet/framework/wcf/extending/how-to-create-a-custom-authorization-manager-for-a-service

上关于serviceAuthorizationManagerType的说明

它说-

警告

请注意,当您指定serviceAuthorizationManagerType时,字符串必须包含完全限定的类型名称。逗号,以及定义类型的程序集的名称。如果省略程序集名称,则WCF将尝试从System.ServiceModel.dll加载类型。

答案 12 :(得分:0)

更改为较旧的Visual Studio。 对我有用的奇怪解决方案。 我正在使用Visual Studio 2017, 更改为Visual Studio 2015后,一切正常。

答案 13 :(得分:0)

在Visual Studio中:

  1. 项目属性(右键单击您的项目)
  2. 调试->启动选项
  3. 确保“命令行参数”为空

答案 14 :(得分:-1)

我观察到当我从ServiceContract属性中删除SessionMode时,问题就消失了。

示例:

[ServiceContract(SessionMode=SessionMode.Required, CallbackContract=typeof(ICallbacks))]
 public interface IStringReverser
 {
   [OperationContract]
   string ReverseString(string value);
 }

为...

[ServiceContract()]
 public interface IStringReverser
 {
   [OperationContract]
   string ReverseString(string value);
 }

答案 15 :(得分:-1)

将此添加到您的web.config文件并根据您的服务名称和合同名称进行配置。

<behaviors>
   <serviceBehaviors>
      <behavior name="metadataBehavior">
         <serviceMetadata httpGetEnabled="true" />
      </behavior>
   </serviceBehaviors>
</behaviors>
<services>
   <service name="MyService.MyService" behaviorConfiguration="metadataBehavior">
      <endpoint 
          address=""   <!-- don't put anything here - Cassini will determine address -->
          binding="basicHttpBinding" 
          contract="MyService.IMyService"/>
      <endpoint 
          address="mex" 
          binding="mexHttpBinding" 
          contract="IMetadataExchange"/>
   </service>
</services>

请在Service.svc

中添加
using System.ServiceModel.Description;

希望它会对你有所帮助。