Wcf REST 服务和客户端
Wcf REST Service and Client
你好,我找了很久,但每一个答案都没有解决我的问题。我有 REST 服务
namespace WcfService1
{
[ServiceContract]
public interface IRestServiceImpl
{
[OperationContract]
[WebInvoke(Method = "GET",
ResponseFormat = WebMessageFormat.Xml,
BodyStyle = WebMessageBodyStyle.Wrapped,
UriTemplate = "images")]
List<MyImage> getImages();
}
[DataContract]
public class MyImage
{
public MyImage(string name, Image img)
{
Name = name;
Img = img;
}
[DataMember]
public string Name
{
get;
set;
}
[DataMember]
public Image Img
{
get;
set;
}
}
}
实现如下:
namespace WcfService1
{
public class RestServiceImpl : IRestServiceImpl
{
public List<MyImage> getImages()
{
List<MyImage> images = new List<MyImage>();
string[] files = Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory, "*.jpg");
foreach (string file in files)
{
Image im = Image.FromFile(file);
images.Add(new MyImage(file, im));
}
return images;
}
}
}
Web.Config:
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<services>
<service name="WcfService1.RestServiceImpl" behaviorConfiguration="ServiceBehaviour">
<endpoint address="" binding="webHttpBinding" contract="WcfService1.IRestServiceImpl" behaviorConfiguration="web">
</endpoint>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehaviour">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="web">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>
接下来,我创建了客户端应用程序并添加了服务引用,并从上层声明的本地主机中选择引用
有客户端代码
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
ServiceReference1.RestServiceImplClient service = new ServiceReference1.RestServiceImplClient();
ServiceReference1.MyImage[] images = service.getImages();
service.Close();
List<ServiceReference1.MyImage> files = images.Select(im => new ServiceReference1.MyImage() { Img = im.Img, Name = im.Name }).ToList();
listViewImages.ItemsSource = files;
}
}
这一行:
ServiceReference1.MyImage[] images = service.getImages();
我有例外:
There was no endpoint listening at http://localhost:55008/RestServiceImpl.svc that could accept the message. This is often caused by an incorrect address or SOAP action. See InnerException, if present, for more details.
当我查看 InnerException 时,我有:
The remote server returned an error: (404) Not Found.
这是我的 app.config 客户文件:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<client>
<endpoint address="http://localhost:55008/RestServiceImpl.svc" binding="basicHttpBinding" contract="ServiceReference1.IRestServiceImpl">
</endpoint>
</client>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehaviour">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
我知道这个话题很受欢迎,但所有的答案都帮不了我。
根据您发布的代码,服务 web.config 没有带 BasicHttpBinding 的端点。要通过代理使用服务,我相信您需要根据问题中的客户端 web.config 添加带有 BasicHttpBinding 的端点。它确实公开了一个 REST 端点。要调用 REST 服务,您可以使用 url 调用,如下所示。
http://localhost:55008/RestServiceImpl.svc/images
尝试在客户端代码中添加 REST 服务的 Web 引用而不是服务引用。
你好,我找了很久,但每一个答案都没有解决我的问题。我有 REST 服务
namespace WcfService1
{
[ServiceContract]
public interface IRestServiceImpl
{
[OperationContract]
[WebInvoke(Method = "GET",
ResponseFormat = WebMessageFormat.Xml,
BodyStyle = WebMessageBodyStyle.Wrapped,
UriTemplate = "images")]
List<MyImage> getImages();
}
[DataContract]
public class MyImage
{
public MyImage(string name, Image img)
{
Name = name;
Img = img;
}
[DataMember]
public string Name
{
get;
set;
}
[DataMember]
public Image Img
{
get;
set;
}
}
}
实现如下:
namespace WcfService1
{
public class RestServiceImpl : IRestServiceImpl
{
public List<MyImage> getImages()
{
List<MyImage> images = new List<MyImage>();
string[] files = Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory, "*.jpg");
foreach (string file in files)
{
Image im = Image.FromFile(file);
images.Add(new MyImage(file, im));
}
return images;
}
}
}
Web.Config:
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<services>
<service name="WcfService1.RestServiceImpl" behaviorConfiguration="ServiceBehaviour">
<endpoint address="" binding="webHttpBinding" contract="WcfService1.IRestServiceImpl" behaviorConfiguration="web">
</endpoint>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehaviour">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="web">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>
接下来,我创建了客户端应用程序并添加了服务引用,并从上层声明的本地主机中选择引用
有客户端代码
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
ServiceReference1.RestServiceImplClient service = new ServiceReference1.RestServiceImplClient();
ServiceReference1.MyImage[] images = service.getImages();
service.Close();
List<ServiceReference1.MyImage> files = images.Select(im => new ServiceReference1.MyImage() { Img = im.Img, Name = im.Name }).ToList();
listViewImages.ItemsSource = files;
}
}
这一行:
ServiceReference1.MyImage[] images = service.getImages();
我有例外:
There was no endpoint listening at http://localhost:55008/RestServiceImpl.svc that could accept the message. This is often caused by an incorrect address or SOAP action. See InnerException, if present, for more details.
当我查看 InnerException 时,我有:
The remote server returned an error: (404) Not Found.
这是我的 app.config 客户文件:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<client>
<endpoint address="http://localhost:55008/RestServiceImpl.svc" binding="basicHttpBinding" contract="ServiceReference1.IRestServiceImpl">
</endpoint>
</client>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehaviour">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
我知道这个话题很受欢迎,但所有的答案都帮不了我。
根据您发布的代码,服务 web.config 没有带 BasicHttpBinding 的端点。要通过代理使用服务,我相信您需要根据问题中的客户端 web.config 添加带有 BasicHttpBinding 的端点。它确实公开了一个 REST 端点。要调用 REST 服务,您可以使用 url 调用,如下所示。
http://localhost:55008/RestServiceImpl.svc/images
尝试在客户端代码中添加 REST 服务的 Web 引用而不是服务引用。