为什么我的PCF和POST的WCF RESTful客户端应用程序会出现400和405异常?

时间:2010-12-09 01:54:02

标签: asp.net rest wcf

我正在构建一个具有两个服务器设置的应用程序 - “服务”服务器和“前端”服务器。 “服务”服务器具有WCF服务。 “前端”服务器具有访问WCF服务的传统ASP.NET Web表单应用程序。我可以让GET请求正常工作。但是我似乎无法获得任何PUT或POST请求。当我尝试发布POST时,我得到400异常 - 错误请求。当我尝试发出PUT时,我得到405例外 - 方法不允许。我觉得我已经正确设置了一切 - 但显然没有。这是我的WCF服务的代码:

Service.svc:

<%@ ServiceHost Language="C#" Debug="true" Service="TestSvc" Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>

TestSvc.cs:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceContract]
public class TestSvc
{
    [WebGet(UriTemplate="/")]
    [OperationContract]
    public Users GetUsers() 
    { ...code to get all users from database }

    [WebInvoke(UriTemplate = "/", Method = "POST")]
    [OperationContract]
    public void AddUser(User user) 
    { ...code to add user to database }

    [WebInvoke(UriTemplate = "/{id}", Method = "PUT")]
    [OperationContract]
    public void UpdateUser(string id, User user) 
    { ...code to update user in database }

    [WebGet(UriTemplate = "/{id}")]
    [OperationContract]
    public User GetUser(string id) 
    { ...code to get a single user from database }
}

(另外我有用户和用户实体的课程)

然后在前端我有这个界面:

[ServiceContract]
interface ITestService
{
    [WebGet(UriTemplate = "/")]
    [OperationContract]
    Users GetUsers();

    [WebInvoke(UriTemplate = "/", Method = "POST")]
    [OperationContract]
    void AddUser(User user);

    [WebInvoke(UriTemplate = "/{id}", Method = "PUT")]
    [OperationContract]
    void UpdateUser(string id, User user);

    [WebGet(UriTemplate = "/{id}")]
    [OperationContract]
    User GetUser(string id);
}

然后我有了这个助手类:

public class ServiceClient
{
    WebChannelFactory<ITestService> cf;
    ITestService channel;

    public ServiceClient()
    {
        cf = new WebChannelFactory<ITestService>(new Uri("http://myserver/service.svc"));
        channel = cf.CreateChannel();
    }

    public Users GetUsers()
    { return channel.GetUsers(); }

    public User GetUser(string id)
    { return channel.GetUser(id); }

    public void AddUser(User user)
    { channel.AddUser(user); }

    public void UpdateUser(string id, User user)
    { channel.UpdateUser(id, user); }
}

最后,这是我的页面上的代码背后的代码,它正在尝试更新User对象。

    protected void btnSave_Click(object sender, EventArgs e)
    {
        User _user = new User(Convert.ToInt32(txtID.Value), txtFirstName.Text, txtLastName.Text, Convert.ToInt32(txtAge.Text), chkIsRegistered.Checked);
        ServiceClient _client = new ServiceClient();
        _client.UpdateUser(txtID.Value, _user);
        Response.Redirect("~/ViewUsers.aspx");
    }

当我运行前端项目并尝试进行更新时,我收到以下错误:

远程服务器返回了意外响应:(405)Method Not Allowed。

有什么想法吗?谢谢,Corey

2 个答案:

答案 0 :(得分:0)

您发送了多少数据?当一次发送超过64k时,我遇到了WCF服务的问题(使用默认配置,您可以增加它)。在这种情况下,POST通常会返回400,但我不知道PUT会返回什么,因为我的服务不使用PUT。

答案 1 :(得分:0)

我解决了部分问题。我删除了IIS中的WebDav模块,然后PUT开始工作。 (我认为它与处理PUT和DELETE动词的WebDav有关)但是POST动词不起作用。它返回400 Bad Request错误。我将尝试在另一个问题中解决这个问题。