2014-09-14 5 views
11

पर ASP.NET वेबएपीआई और डेटाबेस के साथ काम नहीं कर रहा है और हटाएं मैं मूल सीआरयूडी संचालन के साथ एएसपी.NET वेबएपीआई प्रोजेक्ट पर काम कर रहा हूं। यह परियोजना स्थानीय रूप से चलती है और इसमें विंडोज़ एज़ूर के अंदर एक नमूना डेटाबेस रहता है।विंडोज एज़ूर

अब तक, एचटीपी जीईटी और पोस्ट ठीक काम करता है, मुझे 200 और 201 दे रहा है। लेकिन मैं डेली और पोस्ट के साथ संघर्ष कर रहा हूं। मैंने Web.config में हैंडलर को बदल दिया, वेबडाव हटा दिया, लेकिन इनमें से कोई भी काम नहीं किया। सीओआरएस को सक्षम करने और [AcceptVerbs] जैसे सभी प्रकार के गुण काम नहीं कर पाए।

कोई विचार क्या मैं गलत कर रहा हूं?

फ़िडलर कच्चे आउटपुट:

HTTP/1.1 405 Method Not Allowed 
Cache-Control: no-cache 
Pragma: no-cache 
Allow: GET 
Content-Type: application/json; charset=utf-8 
Expires: -1 
Server: Microsoft-IIS/8.0 
X-AspNet-Version: 4.0.30319 
X-SourceFiles: =?UTF-8?B?QzpcVXNlcnNcTWFyY1xPbmVEcml2ZVxEb2t1bWVudGVcRmlcVnNQcm9qZWt0ZVxONTIwMTQwODI1XE41XE41XGFwaVxwcm9kdWN0XDEwODM=?= 
X-Powered-By: ASP.NET 
Date: Sun, 14 Sep 2014 15:00:43 GMT 
Content-Length: 75 

{"Message":"The requested resource does not support http method 'DELETE'."} 

Web.config:

<system.webServer> 
    <validation validateIntegratedModeConfiguration="false" /> 
    <modules runAllManagedModulesForAllRequests="true"> 
     <remove name="WebDAVModule" /> 
    </modules> 
    <handlers> 
     <remove name="WebDAV" /> 
     <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 
     <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" /> 
    </handlers> 
</system.webServer> 

नियंत्रक:

public class ProductController : BaseApiController 
    { 
     public ProductController(IRepository<Product> repo) 
      : base(repo) 
     { 

     } 

     [HttpGet] 
     public IEnumerable<Product> Get() 
     { 
      //... 
     } 

     [HttpGet] 
     public Product Get(int id) 
     { 
      //... 
     } 

     [HttpPost] 
     public HttpResponseMessage Post([FromBody] Product product) 
     { 
      //... 
     } 

     [HttpPut] 
     public HttpResponseMessage Put(int productId, [FromBody] Product product) 
     { 
      //.. 
     } 

     [HttpDelete] 
     public HttpResponseMessage Delete(int productId) 
     { 
      //.. 
     } 

    } 

रूटिंग & formatters:

public static void Register(HttpConfiguration config) 
    { 
     // Web API configuration and services 
     // Configure Web API to use only bearer token authentication. 
     config.SuppressDefaultHostAuthentication(); 
     config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType)); 


     config.Routes.MapHttpRoute(
      name: "Product", 
      routeTemplate: "api/product/{id}", 
      defaults: new {controller = "product", id = RouteParameter.Optional } 
     ); 

     // Custom Formatters: 
     config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(
      config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml")); 

     var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First(); 
     jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 
    } 
} 
+0

आप विशेषता रूटिंग क्यों कॉल कर रहे हैं लेकिन आप मार्ग को कॉन्फ़िगर करने के पूर्व WebApi2 तरीके का उपयोग करके उत्पाद मार्ग कॉन्फ़िगर करते हैं? –

+0

यह एक बचे हुए है और वहां नहीं होना चाहिए। मैं इसे अद्यतन करता हूँ। thx – oldsport

उत्तर

25

अंत में मैंने पाया कि मैंने क्या गड़बड़ की है। कंट्रोलर विधियों (पोस्ट और पुट) दोनों में आईडी (productId) का नामकरण अनुकूलित रूटिंग (आईडी) जैसा ही होना चाहिए। जब मैंने इसे उत्पाद से बदल दिया, आईडी में आईडी और पीयूटी ने फिडलर में काम किया। इसके बाद मैंने अपनी Web.config सेटिंग्स को डिफ़ॉल्ट पर वापस स्विच किया। यह मैं क्या बदल रहा है:

नियंत्रक:

[HttpPut] 
    public HttpResponseMessage Put(int id, [FromBody] Product product) 
    { 
     //.. 
    } 

    [HttpDelete] 
    public HttpResponseMessage Delete(int id) 
    { 
     //.. 
    } 

Web.config:

<system.webServer> 
<modules> 
    <remove name="FormsAuthentication" /> 
</modules> 
<handlers> 
    <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 
    <remove name="OPTIONSVerbHandler" /> 
    <remove name="TRACEVerbHandler" /> 
    <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 
</handlers> 

+0

यदि बिल्ड-इन डिफ़ॉल्ट रूटिंग का उपयोग करते हैं, तो पैरामीटर नाम भी "आईडी" होना चाहिए। – RMorrisey

7

"ASP.NET वेब एपीआई 2 में रूटिंग गुण" (20-जनवरी -2014) लेख हमें निम्नलिखित बताता है;

रूटिंग यह है कि वेब एपीआई एक कार्रवाई के लिए यूआरआई से कैसे मेल खाता है। वेब एपीआई 2 का समर्थन करता है एक नया प्रकार का रूटिंग, जिसे विशेषता रूटिंग कहा जाता है।

(देखें: "Attribute Routing in ASP.NET Web API 2")

तो, जाल एपीआई 2 के रूप में, आप भी यह मार्ग विशेषता के रूप में आप चाहते हैं नामित प्लेस होल्डर से [प्रश्न में विधि करने के लिए] जोड़कर ठीक कर सकते हैं।

[HttpDelete] 
[Route("api/product/{productId}")] 
public HttpResponseMessage Delete(int productId) 
{ 
    if (values.Count > productId) { 
     values.RemoveAt(productId); 
    } 
} 

इसे अपने कोड में परीक्षण किया, क्योंकि मुझे एक ही समस्या के साथ मारा गया था, और यह एक आकर्षण की तरह काम करता था!

+0

उपरोक्त कोड में, उत्पाद क्यों नहीं हो सका मूल्यों से अधिक हो। गणना करें और अभी भी मान्य हो। जहां तक ​​मैं देख सकता हूं, अगर इसका उपयोग अंततः विफल हो जाएगा। –

+0

@ किशनन स्टीवर्ट कोड सिर्फ एक त्वरित और गंदे नमूना है। यह विशेषता रूटिंग के बारे में है। –

संबंधित मुद्दे