我正在试图弄清楚如何从Windows智能手机调用WCF服务。我有一个非常简单的智能手机控制台应用程序,除了启动和拨打该服务之外什么都不做。该服务只返回一个字符串。我能够实例化代理类,但是当我调用该方法时,它会引发异常:
没有终点收听 http://mypcname/Service1.svc/basic那个 可以接受这个消息。这是 通常由不正确的地址引起 或SOAP动作。请参阅InnerException,if 目前,了解更多详情。
内部异常:
无法建立连接 网络
我尝试按照this教程使用windows mobile设置服务。
我使用NetCFSvcUtil来创建代理类。我在我的机器上的IIS上运行该服务,并让Util从该位置使用wsdl。我已经根据文章中的建议创建了一个基本的http绑定,我想我已经将代理指向了正确的uri。
这里有相关代码的一些部分,以防有助于查看。如果有人有任何建议,我真的很感激。我不知道还有什么可以让这个东西发挥作用。
谢谢!
客户端,(Program.cs):
using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;
namespace WcfPoC
{
class Program
{
static void Main(string[] args)
{
try
{
Service1Client proxy = new Service1Client();
string test = proxy.GetData(5);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
Console.WriteLine(e.InnerException.Message);
Console.WriteLine(e.StackTrace);
}
}
}
}
客户端代理摘录(Service1.cs):
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public partial class Service1Client : Microsoft.Tools.ServiceModel.CFClientBase<IService1>, IService1
{
//modified according to the walk thru linked above...
public static System.ServiceModel.EndpointAddress EndpointAddress = new System.ServiceModel.EndpointAddress("http://boston7/Service1.svc/basic");
/*
*a bunch of code create by the svc util - left unmodified
*/
}
服务(Service1.svc.cs):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
namespace WcfService1
{
// NOTE: If you change the class name "Service1" here, you must also update the reference to "Service1" in Web.config and in the associated .svc file.
public class Service1 : IService1
{
public string GetData(int value) //i'm calling this one...
{
return string.Format("You entered: {0}", value);
}
public CompositeType GetDataUsingDataContract(CompositeType composite)
{
if (composite.BoolValue)
{
composite.StringValue += "Suffix";
}
return composite;
}
}
}
服务接口(IService1.cs):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
namespace WcfService1
{
// NOTE: If you change the interface name "IService1" here, you must also update the reference to "IService1" in Web.config.
[ServiceContract]
public interface IService1
{
[OperationContract]
string GetData(int value); //this is the call im using...
[OperationContract]
CompositeType GetDataUsingDataContract(CompositeType composite);
// TODO: Add your service operations here
}
// Use a data contract as illustrated in the sample below to add composite types to service operations.
[DataContract]
public class CompositeType
{
/*
* ommitted - not using this type anyway...
*/
}
}
Web.config摘录:
<services>
<service name="WcfService1.Service1" behaviorConfiguration="WcfService1.Service1Behavior">
<!-- Service Endpoints -->
<endpoint address="" binding="basicHttpBinding" contract="WcfService1.IService1"/>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
<host>
<baseAddresses>
<add baseAddress="http://boston7/" />
</baseAddresses>
</host>
</service>
</services>
答案 0 :(得分:1)
我认为您的问题是因为在IIS中,端点地址始终被认为是相对于代表服务的.svc文件的地址。
您在basicHttp端点中使用了一个空地址,因此这将仅解析.svc文件的路径。
我会建议两件事。由于您在IIS上托管,添加“basic”作为basicHttpBinding的地址并删除主机基址,这是多余的。
每个MSDN:您必须始终为IIS托管的服务端点使用相对端点地址。如果端点地址未指向承载公开端点的服务的IIS应用程序,则提供完全限定的端点地址(例如,http://localhost/MyService.svc)可能会导致服务部署出错。使用托管服务的相对端点地址可以避免这些潜在的冲突