开发者

Why am I getting 400 and 405 exceptions with my WCF RESTful client application with PUT and POST?

I am building an application that has a two server setup - a "services" server and a "front end" server. The "services" server has a WCF service. The "front end" server has a traditional ASP.NET web forms application that accesses the WCF service. I can get the GET requests to work fine. However I can't seem to get any PUT or POST requests to work. When I try to issue a POST I get a 400 exception - Bad Request. When I try to issue a PUT I get a 405 exception - Method Not Allowed. I feel like I have everything set up correctly - but obviously not. Here is the code for my WCF service:

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 }
}

(In a开发者_JAVA技巧ddition I have classes for the User and Users entities)

Then on the front end I have this interface:

[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);
}

And then I have this helper class:

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); }
}

And finally here is what the code behind looks like on my page that is trying to do an update of a User object.

    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");
    }

When I run the front end project and try to do an update I get the following error:

The remote server returned an unexpected response: (405) Method Not Allowed.

Any ideas? Thanks, Corey


How much data are you sending? I have had trouble with WCF services when sending more than 64k at a time (with the default configuration, you can increase it). POST would typically return a 400 in this case, but I don't know what PUT would return, since my service doesn't use PUT.


I solved part of the problem. I deleted the WebDav module in IIS for the site and then the PUT began to work. (I think it has to do with WebDav handling the PUT and DELETE verbs) However the POST verb is not working. It is returning a 400 Bad Request error. I will try solving that in a separate question.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜