编辑:
我修改了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>
答案 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决定 - 您无法定义任何内容。
所以我的建议是:
所以我将配置更改为:
<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>
上关于serviceAuthorizationManagerType的说明
它说-
警告
请注意,当您指定serviceAuthorizationManagerType时,字符串必须包含完全限定的类型名称。逗号,以及定义类型的程序集的名称。如果省略程序集名称,则WCF将尝试从System.ServiceModel.dll加载类型。
答案 12 :(得分:0)
更改为较旧的Visual Studio。 对我有用的奇怪解决方案。 我正在使用Visual Studio 2017, 更改为Visual Studio 2015后,一切正常。
答案 13 :(得分:0)
在Visual Studio中:
答案 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;
希望它会对你有所帮助。