首页 文章

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

提问于
浏览
36

编辑:

在我修改了 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页面并自行运行项目,所以我假设服务也在运行...

这可能有什么问题?

END EDIT

我刚刚创建了一个新的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上没有可以接受该消息的 endpoints . 这通常是由错误的地址或SOAP操作引起的 . 有关更多详细信息,请参阅InnerException(如果存在) . 无法连接到远程服务器无法 Build 连接,因为目标计算机主动拒绝它127.0.0.1:3696 HTTP GET错误URI:http:// localhost:3696 / MyService.svc下载'http://时出错本地主机:3696 / MyService.svc” . 无法连接到远程服务器无法 Build 连接,因为目标计算机主动拒绝它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>

13 回答

  • -1

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

    <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>
    

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

    Update: 好的,所以你只是从Visual Studio中启动它 - 在这种情况下,它将托管在内置的Web服务器Cassini中 . 那个野兽 only 支持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

  • 0

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

  • 34

    FYI - YOU CAN also get this error from a machine that is not having enough memory free. 我在运行16 gig内存的机器上出现此错误 . 我有一个运行6个演出的VM和很多内存密集型应用程序 . 关闭一些,这个问题就消失了 .

    我仍然在问题的 Headers 中得到了错误

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

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

    希望这有助于其他人 .

  • 2

    在您公开的类型之前添加 Serializable()

    Serializable()
    Public Class YourType
    

    Serializable 放入 <>

  • 1

    在我的情况下,我收到此错误,因为没有启用选项(HttpActivation) .
    Windows features dialog box showing HTTP Activation under WCF Services under .NET Framework 4.6 Advanced Services

  • 15

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

  • 0

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

  • 0

    在我的情况下,评论出来的

    <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
    

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

  • 3

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

  • -1

    大多数情况下,这是由于较少的内存空间 . 首先检查然后尝试其他一些技巧 .

  • 3

    属性 IsOneWay=true 在接口的操作 Contract 中可能为true . 删除该属性以消除此错误 .

  • 6

    我发现当我从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);
     }
    
  • 2

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

    <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;
    

    希望它能帮到你 .

相关问题