【发布时间】:2012-07-10 07:15:06
【问题描述】:
我有一个OperationContract 方法,我试图在其中查询数据并将数据插入数据库。我正在使用POST 方法并从浏览器中的javascript 调用服务。 WCF 服务在同一个域中,所以我不必使用JSONP。我也在修改数据,所以它应该是 POST 请求而不是 GET 请求。但是我仍然收到“方法不允许错误”。有人遇到过这种情况吗?
我的服务正在调用
http://some_url.com/services/ProfileService.svc/json/CurrentUser
奇怪的是,即使我指定了POST,当我转到此网址时,它似乎也是通过GET 请求调用的。然而,在页面加载时,它似乎正在尝试 POST 请求。
访问 url 时的浏览器响应:
Request URL:http://some_url.com/services/ProfileService.svc/json/CurrentUser
Request Method:GET
Status Code:405 Method Not Allowed
Request Headersview parsed
GET /services/ProfileService.svc/json/CurrentUser HTTP/1.1
这是我尝试调用的方法:
[OperationContract]
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json)]
public HIPUser GetCurrentUser()
{
string[] domainUser;
string Auth_User = HttpContext.Current.User.Identity.Name.ToString().ToLower();
domainUser = Auth_User.Split('\\');
string user = domainUser[1];
Debug.WriteLine(user);
ProfileManager pm = new ProfileManager();
var results = pm.GetUserByUserName(user);
if (results.Length > 0)
{
return results.First();
}
else
{
Debug.WriteLine("IS NULL");
var x = pm.CreateUser(user, null, null);
Debug.WriteLine(x.UserName);
return x;
}
}
客户:
function getCurrentUser() {
$.ajax({
type: "POST",
url: "services/ProfileService.svc/json/GetCurrentUser",
contentType: "application/json; charset=utf-8",
data: null,
dataType: "json",
error: function (request, error, u) {
alert('blargherror: ' + error);
},
success: function (result, status) {
alert(result.d);
}
});
}
不确定是否需要,但Web.Config:
<behaviors>
<endpointBehaviors>
<behavior name="jsonBehavior">
<enableWebScript />
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="metaBehavior">
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceMetadata httpGetEnabled="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment
aspNetCompatibilityEnabled="true"
multipleSiteBindingsEnabled="true" />
<services>
<service name="ProfileService" behaviorConfiguration="metaBehavior">
<endpoint address="/json"
behaviorConfiguration="jsonBehavior"
binding="webHttpBinding"
bindingConfiguration="secure"
contract="ProfileService" />
<endpoint address=""
binding="basicHttpBinding"
bindingConfiguration="secure"
contract="ProfileService" />
</service>
</services>
编辑到 Web.Config - 添加绑定
<bindings>
<webHttpBinding>
<binding name="secure">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows"/>
</security>
</binding>
</webHttpBinding>
<basicHttpBinding>
<binding name="secure">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows" />
</security>
</binding>
</basicHttpBinding>
</bindings>
【问题讨论】:
-
这不会解决您的问题,但最好将
"{}"作为数据而不是 null (encosia.com/…) 进行传递 -
我找不到你的代码有什么问题,我刚刚创建了一个具有相同配置的类似服务并且它工作正常,唯一的区别是
bindingConfiguration="secure",我猜你没有发布该绑定出于安全原因,如果您可以发布它会很有用。您是否尝试删除该绑定配置并查看是否可以访问您的服务? -
我尝试删除它,但我仍然得到同样的错误。我在上面的问题中添加了绑定配置。我认为这可能与我的方法有关。我做了更多测试,返回的对象 HIPUser 似乎有问题,该对象是使用 ADO.NET 实体数据模型创建的对象。
-
@jocey - 你有 Fiddler 可以拦截响应吗?如果 GetCurrentUser() 返回一个字符串(用于测试目的)而不是 HIPUser 对象会发生什么?
-
我之前没用过 Fiddler。会去调查的。如果我将方法更改为它确实被调用的字符串,那么我返回的 HIPUser 对象肯定有问题。