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 引用而不是服务引用。